tests/Makefile.am tests/autotestfilechooser.c tests/buildertest.c
authorMichael Natterer <mitch@imendio.com>
Wed, 18 Jun 2008 13:29:02 +0000 (13:29 +0000)
committerMichael Natterer <mitch@src.gnome.org>
Wed, 18 Jun 2008 13:29:02 +0000 (13:29 +0000)
2008-06-18  Michael Natterer  <mitch@imendio.com>

* tests/Makefile.am
* tests/autotestfilechooser.c
* tests/buildertest.c
* tests/defaultvaluetest.c
* tests/floatingtest.c
* tests/objecttests.c
* tests/pixbuf-init.c
* tests/textbuffertest.c: remove unit tests here...

* gtk/tests/Makefile.am
* gtk/tests/builder.c
* gtk/tests/defaultvalue.c
* gtk/tests/filechooser.c
* gtk/tests/floating.c
* gtk/tests/object.c
* gtk/tests/pixbuf-init.c
* gtk/tests/textbuffer.c: ...and add them here.

svn path=/trunk/; revision=20450

17 files changed:
ChangeLog
gtk/tests/Makefile.am
gtk/tests/builder.c [new file with mode: 0644]
gtk/tests/defaultvalue.c [new file with mode: 0644]
gtk/tests/filechooser.c [new file with mode: 0644]
gtk/tests/floating.c [new file with mode: 0644]
gtk/tests/object.c [new file with mode: 0644]
gtk/tests/pixbuf-init.c [new file with mode: 0644]
gtk/tests/textbuffer.c [new file with mode: 0644]
tests/Makefile.am
tests/autotestfilechooser.c [deleted file]
tests/buildertest.c [deleted file]
tests/defaultvaluetest.c [deleted file]
tests/floatingtest.c [deleted file]
tests/objecttests.c [deleted file]
tests/pixbuf-init.c [deleted file]
tests/textbuffertest.c [deleted file]

index 2932e65f405243b1bbee80480237a1ee953bd252..2583b120644a347b67e97c7a5a83f09c6b209fab 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2008-06-18  Michael Natterer  <mitch@imendio.com>
+
+       * tests/Makefile.am
+       * tests/autotestfilechooser.c
+       * tests/buildertest.c
+       * tests/defaultvaluetest.c
+       * tests/floatingtest.c
+       * tests/objecttests.c
+       * tests/pixbuf-init.c
+       * tests/textbuffertest.c: remove unit tests here...
+
+       * gtk/tests/Makefile.am
+       * gtk/tests/builder.c
+       * gtk/tests/defaultvalue.c
+       * gtk/tests/filechooser.c
+       * gtk/tests/floating.c
+       * gtk/tests/object.c
+       * gtk/tests/pixbuf-init.c
+       * gtk/tests/textbuffer.c: ...and add them here.
+
 2008-06-18  Michael Natterer  <mitch@imendio.com>
 
        * gdk/gdk.h: deprecate GdkDestroyNotify.
index f7479cbe866877a98296176c15f2de9425eb18dd..b9a5afa45afb499ccfd418eec214ad33cac95749 100644 (file)
@@ -1,42 +1,73 @@
 include $(top_srcdir)/Makefile.decl
 
-INCLUDES =                                      \
-          -I$(top_srcdir)                      \
-          -I$(top_builddir)/gdk                \
-          -I$(top_srcdir)/gdk                  \
-          -DGDK_PIXBUF_DISABLE_DEPRECATED      \
-          -DGDK_DISABLE_DEPRECATED             \
-          -DGTK_DISABLE_DEPRECATED             \
-          $(GTK_DEBUG_FLAGS)                   \
-          $(GTK_DEP_CFLAGS)
-
-DEPS = $(top_builddir)/gdk-pixbuf/libgdk_pixbuf-$(GTK_API_VERSION).la  \
-        $(top_builddir)/gdk/$(gdktargetlib)                             \
-        $(top_builddir)/gtk/$(gtktargetlib)
-
-progs_ldadd     = $(top_builddir)/gdk-pixbuf/libgdk_pixbuf-$(GTK_API_VERSION).la \
-                 $(top_builddir)/gdk/$(gdktargetlib)                            \
-                 $(top_builddir)/gtk/$(gtktargetlib)
+INCLUDES = \
+       -I$(top_srcdir)                 \
+       -I$(top_builddir)/gdk           \
+       -I$(top_srcdir)/gdk             \
+       -DGDK_PIXBUF_DISABLE_DEPRECATED \
+       -DGDK_DISABLE_DEPRECATED        \
+       -DGTK_DISABLE_DEPRECATED        \
+       $(GTK_DEBUG_FLAGS)              \
+       $(GTK_DEP_CFLAGS)
+
+DEPS = \
+       $(top_builddir)/gdk-pixbuf/libgdk_pixbuf-$(GTK_API_VERSION).la  \
+       $(top_builddir)/gdk/$(gdktargetlib)                             \
+       $(top_builddir)/gtk/$(gtktargetlib)
+
+progs_ldadd = \
+       $(top_builddir)/gdk-pixbuf/libgdk_pixbuf-$(GTK_API_VERSION).la  \
+       $(top_builddir)/gdk/$(gdktargetlib)                             \
+       $(top_builddir)/gtk/$(gtktargetlib)
 
 noinst_PROGRAMS = $(TEST_PROGS)
 
 
-TEST_PROGS       += testing
-testing_SOURCES          = testing.c
-testing_LDADD    = $(progs_ldadd)
+TEST_PROGS                     += testing
+testing_SOURCES                         = testing.c
+testing_LDADD                   = $(progs_ldadd)
+
+TEST_PROGS                     += liststore
+liststore_SOURCES               = liststore.c
+liststore_LDADD                         = $(progs_ldadd)
+
+TEST_PROGS                     += treestore
+treestore_SOURCES               = treestore.c
+treestore_LDADD                         = $(progs_ldadd)
+
+TEST_PROGS                     += treeview-scrolling
+treeview_scrolling_SOURCES      = treeview-scrolling.c
+treeview_scrolling_LDADD        = $(progs_ldadd)
+
+TEST_PROGS                     += recentmanager
+recentmanager_SOURCES           = recentmanager.c
+recentmanager_LDADD             = $(progs_ldadd)
+
+TEST_PROGS                     += floating
+floating_SOURCES                = floating.c
+floating_LDADD                  = $(progs_ldadd)
+
+TEST_PROGS                     += object
+object_SOURCES                  = object.c pixbuf-init.c
+object_LDADD                    = $(progs_ldadd)
 
-TEST_PROGS       += liststore
-liststore_SOURCES = liststore.c
-liststore_LDADD          = $(progs_ldadd)
+# this doesn't work in make distcheck, since it doesn't
+# find file-chooser-test-dir 
+# TEST_PROGS                   += filechooser
+filechooser_SOURCES             = filechooser.c pixbuf-init.c
+filechooser_LDADD               = $(progs_ldadd)
 
-TEST_PROGS       += treestore
-treestore_SOURCES = treestore.c
-treestore_LDADD          = $(progs_ldadd)
+TEST_PROGS                     += builder
+builder_SOURCES                         = builder.c
+builder_LDADD                   = $(progs_ldadd)
+builder_LDFLAGS                         = -export-dynamic
 
-TEST_PROGS                    += treeview-scrolling
-treeview_scrolling_SOURCES     = treeview-scrolling.c
-treeview_scrolling_LDADD       = $(progs_ldadd)
+if OS_UNIX
+TEST_PROGS                     += defaultvalue
+endif
+defaultvalue_SOURCES            = defaultvalue.c pixbuf-init.c 
+defaultvalue_LDADD              = $(progs_ldadd)
 
-TEST_PROGS           += recentmanager
-recentmanager_SOURCES = recentmanager.c
-recentmanager_LDADD   = $(progs_ldadd)
+TEST_PROGS                     += textbuffer
+textbuffer_SOURCES              = textbuffer.c pixbuf-init.c
+textbuffer_LDADD                = $(progs_ldadd)
diff --git a/gtk/tests/builder.c b/gtk/tests/builder.c
new file mode 100644 (file)
index 0000000..de4e080
--- /dev/null
@@ -0,0 +1,2213 @@
+/* buildertest.c
+ * Copyright (C) 2006-2007 Async Open Source
+ * Authors: Johan Dahlin
+ *          Henrique Romano
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <string.h>
+#include <libintl.h>
+#include <locale.h>
+#include <math.h>
+
+#include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
+
+/* Copied from gtkiconfactory.c; keep in sync! */
+struct _GtkIconSet
+{
+  guint ref_count;
+  GSList *sources;
+  GSList *cache;
+  guint cache_size;
+  guint cache_serial;
+};
+
+
+static GtkBuilder *
+builder_new_from_string (const gchar *buffer,
+                         gsize length,
+                         gchar *domain)
+{
+  GtkBuilder *builder;
+  builder = gtk_builder_new ();
+  if (domain)
+    gtk_builder_set_translation_domain (builder, domain);
+  gtk_builder_add_from_string (builder, buffer, length, NULL);
+  return builder;
+}
+
+static void
+test_parser (void)
+{
+  GtkBuilder *builder;
+  GError *error;
+  
+  builder = gtk_builder_new ();
+
+  error = NULL;
+  gtk_builder_add_from_string (builder, "<xxx/>", -1, &error);
+  g_assert (error != NULL);
+  g_assert (error->domain == GTK_BUILDER_ERROR);
+  g_assert (error->code == GTK_BUILDER_ERROR_UNHANDLED_TAG);
+    g_error_free (error);
+  
+  error = NULL;
+  gtk_builder_add_from_string (builder, "<interface invalid=\"X\"/>", -1, &error);
+  g_assert (error != NULL);
+  g_assert (error->domain == GTK_BUILDER_ERROR);
+  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_ATTRIBUTE);
+  g_error_free (error);
+
+  error = NULL;
+  gtk_builder_add_from_string (builder, "<interface><child/></interface>", -1, &error);
+  g_assert (error != NULL);
+  g_assert (error->domain == GTK_BUILDER_ERROR);
+  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_TAG);
+  g_error_free (error);
+
+  error = NULL;
+  gtk_builder_add_from_string (builder, "<interface><object class=\"GtkVBox\" id=\"a\"><object class=\"GtkHBox\" id=\"b\"/></object></interface>", -1, &error);
+  g_assert (error != NULL);
+  g_assert (error->domain == GTK_BUILDER_ERROR);
+  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_TAG);
+  g_error_free (error);
+
+  error = NULL;
+  gtk_builder_add_from_string (builder, "<interface><object class=\"Unknown\" id=\"a\"></object></interface>", -1, &error);
+  g_assert (error != NULL);
+  g_assert (error->domain == GTK_BUILDER_ERROR);
+  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
+  g_error_free (error);
+
+  error = NULL;
+  gtk_builder_add_from_string (builder, "<interface><object class=\"GtkWidget\" id=\"a\" constructor=\"none\"></object></interface>", -1, &error);
+  g_assert (error != NULL);
+  g_assert (error->domain == GTK_BUILDER_ERROR);
+  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
+  g_error_free (error);
+
+  error = NULL;
+  gtk_builder_add_from_string (builder, "<interface><object class=\"GtkButton\" id=\"a\"><child internal-child=\"foobar\"><object class=\"GtkButton\" id=\"int\"/></child></object></interface>", -1, &error);
+  g_assert (error != NULL);
+  g_assert (error->domain == GTK_BUILDER_ERROR);
+  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
+  g_error_free (error);
+
+  g_object_unref (builder);
+}
+
+static int normal = 0;
+static int after = 0;
+static int object = 0;
+static int object_after = 0;
+
+void // exported for GtkBuilder
+signal_normal (GtkWindow *window, GParamSpec spec)
+{
+  g_assert (GTK_IS_WINDOW (window));
+  g_assert (normal == 0);
+  g_assert (after == 0);
+
+  normal++;
+}
+
+void // exported for GtkBuilder
+signal_after (GtkWindow *window, GParamSpec spec)
+{
+  g_assert (GTK_IS_WINDOW (window));
+  g_assert (normal == 1);
+  g_assert (after == 0);
+  
+  after++;
+}
+
+void // exported for GtkBuilder
+signal_object (GtkButton *button, GParamSpec spec)
+{
+  g_assert (GTK_IS_BUTTON (button));
+  g_assert (object == 0);
+  g_assert (object_after == 0);
+
+  object++;
+}
+
+void // exported for GtkBuilder
+signal_object_after (GtkButton *button, GParamSpec spec)
+{
+  g_assert (GTK_IS_BUTTON (button));
+  g_assert (object == 1);
+  g_assert (object_after == 0);
+
+  object_after++;
+}
+
+void // exported for GtkBuilder
+signal_first (GtkButton *button, GParamSpec spec)
+{
+  g_assert (normal == 0);
+  normal = 10;
+}
+
+void // exported for GtkBuilder
+signal_second (GtkButton *button, GParamSpec spec)
+{
+  g_assert (normal == 10);
+  normal = 20;
+}
+
+void // exported for GtkBuilder
+signal_extra (GtkButton *button, GParamSpec spec)
+{
+  g_assert (normal == 20);
+  normal = 30;
+}
+
+void // exported for GtkBuilder
+signal_extra2 (GtkButton *button, GParamSpec spec)
+{
+  g_assert (normal == 30);
+  normal = 40;
+}
+
+static void
+test_connect_signals (void)
+{
+  GtkBuilder *builder;
+  GObject *window;
+  const gchar buffer[] =
+    "<interface>"
+    "  <object class=\"GtkButton\" id=\"button\"/>"
+    "  <object class=\"GtkWindow\" id=\"window1\">"
+    "    <signal name=\"notify::title\" handler=\"signal_normal\"/>"
+    "    <signal name=\"notify::title\" handler=\"signal_after\" after=\"yes\"/>"
+    "    <signal name=\"notify::title\" handler=\"signal_object\""
+    "            object=\"button\"/>"
+    "    <signal name=\"notify::title\" handler=\"signal_object_after\""
+    "            object=\"button\" after=\"yes\"/>"
+    "  </object>"
+    "</interface>";
+  const gchar buffer_order[] =
+    "<interface>"
+    "  <object class=\"GtkWindow\" id=\"window1\">"
+    "    <signal name=\"notify::title\" handler=\"signal_first\"/>"
+    "    <signal name=\"notify::title\" handler=\"signal_second\"/>"
+    "  </object>"
+    "</interface>";
+  const gchar buffer_extra[] =
+    "<interface>"
+    "  <object class=\"GtkWindow\" id=\"window2\">"
+    "    <signal name=\"notify::title\" handler=\"signal_extra\"/>"
+    "  </object>"
+    "</interface>";
+  const gchar buffer_extra2[] =
+    "<interface>"
+    "  <object class=\"GtkWindow\" id=\"window3\">"
+    "    <signal name=\"notify::title\" handler=\"signal_extra2\"/>"
+    "  </object>"
+    "</interface>";
+  const gchar buffer_after_child[] =
+    "<interface>"
+    "  <object class=\"GtkWindow\" id=\"window1\">"
+    "    <child>"
+    "      <object class=\"GtkButton\" id=\"button1\"/>"
+    "    </child>"
+    "    <signal name=\"notify::title\" handler=\"signal_normal\"/>"
+    "  </object>"
+    "</interface>";
+
+  builder = builder_new_from_string (buffer, -1, NULL);
+  gtk_builder_connect_signals (builder, NULL);
+
+  window = gtk_builder_get_object (builder, "window1");
+  gtk_window_set_title (GTK_WINDOW (window), "test");
+
+  g_assert_cmpint (normal, ==, 1);
+  g_assert_cmpint (after, ==, 1);
+  g_assert_cmpint (object, ==, 1);
+  g_assert_cmpint (object_after, ==, 1);
+
+  gtk_widget_destroy (GTK_WIDGET (window));
+  g_object_unref (builder);
+  
+  builder = builder_new_from_string (buffer_order, -1, NULL);
+  gtk_builder_connect_signals (builder, NULL);
+  window = gtk_builder_get_object (builder, "window1");
+  normal = 0;
+  gtk_window_set_title (GTK_WINDOW (window), "test");
+  g_assert (normal == 20);
+
+  gtk_widget_destroy (GTK_WIDGET (window));
+
+  gtk_builder_add_from_string (builder, buffer_extra,
+                              strlen (buffer_extra), NULL);
+  gtk_builder_add_from_string (builder, buffer_extra2,
+                              strlen (buffer_extra2), NULL);
+  gtk_builder_connect_signals (builder, NULL);
+  window = gtk_builder_get_object (builder, "window2");
+  gtk_window_set_title (GTK_WINDOW (window), "test");
+  g_assert (normal == 30);
+
+  gtk_widget_destroy (GTK_WIDGET (window));
+  window = gtk_builder_get_object (builder, "window3");
+  gtk_window_set_title (GTK_WINDOW (window), "test");
+  g_assert (normal == 40);
+  gtk_widget_destroy (GTK_WIDGET (window));
+  
+  g_object_unref (builder);
+
+  /* new test, reset globals */
+  after = 0;
+  normal = 0;
+  
+  builder = builder_new_from_string (buffer_after_child, -1, NULL);
+  window = gtk_builder_get_object (builder, "window1");
+  gtk_builder_connect_signals (builder, NULL);
+  gtk_window_set_title (GTK_WINDOW (window), "test");
+
+  g_assert (normal == 1);
+  gtk_widget_destroy (GTK_WIDGET (window));
+  g_object_unref (builder);
+}
+
+static void
+test_uimanager_simple (void)
+{
+  GtkBuilder *builder;
+  GObject *window, *uimgr, *menubar;
+  GObject *menu, *label;
+  GList *children;
+  const gchar buffer[] =
+    "<interface>"
+    "  <object class=\"GtkUIManager\" id=\"uimgr1\"/>"
+    "</interface>";
+    
+  const gchar buffer2[] =
+    "<interface>"
+    "  <object class=\"GtkUIManager\" id=\"uimgr1\">"
+    "    <child>"
+    "      <object class=\"GtkActionGroup\" id=\"ag1\">"
+    "        <child>"
+    "          <object class=\"GtkAction\" id=\"file\">"
+    "            <property name=\"label\">_File</property>"
+    "          </object>"
+    "          <accelerator key=\"n\" modifiers=\"GDK_CONTROL_MASK\"/>"
+    "        </child>"
+    "      </object>"
+    "    </child>"
+    "    <ui>"
+    "      <menubar name=\"menubar1\">"
+    "        <menu action=\"file\">"
+    "        </menu>"
+    "      </menubar>"
+    "    </ui>"
+    "  </object>"
+    "  <object class=\"GtkWindow\" id=\"window1\">"
+    "    <child>"
+    "      <object class=\"GtkMenuBar\" id=\"menubar1\" constructor=\"uimgr1\"/>"
+    "    </child>"
+    "  </object>"
+    "</interface>";
+
+  builder = builder_new_from_string (buffer, -1, NULL);
+
+  uimgr = gtk_builder_get_object (builder, "uimgr1");
+  g_assert (uimgr != NULL);
+  g_assert (GTK_IS_UI_MANAGER (uimgr));
+  g_object_unref (builder);
+  
+  builder = builder_new_from_string (buffer2, -1, NULL);
+
+  menubar = gtk_builder_get_object (builder, "menubar1");
+  g_assert (menubar != NULL);
+  g_assert (GTK_IS_MENU_BAR (menubar));
+
+  children = gtk_container_get_children (GTK_CONTAINER (menubar));
+  menu = children->data;
+  g_assert (menu != NULL);
+  g_assert (GTK_IS_MENU_ITEM (menu));
+  g_assert (strcmp (GTK_WIDGET (menu)->name, "file") == 0);
+  g_list_free (children);
+  
+  label = G_OBJECT (GTK_BIN (menu)->child);
+  g_assert (label != NULL);
+  g_assert (GTK_IS_LABEL (label));
+  g_assert (strcmp (gtk_label_get_text (GTK_LABEL (label)), "File") == 0);
+
+  window = gtk_builder_get_object (builder, "window1");
+  gtk_widget_destroy (GTK_WIDGET (window));
+  g_object_unref (builder);
+}
+
+static void
+test_domain (void)
+{
+  GtkBuilder *builder;
+  const gchar buffer1[] = "<interface/>";
+  const gchar buffer2[] = "<interface domain=\"domain\"/>";
+  const gchar *domain;
+  
+  builder = builder_new_from_string (buffer1, -1, NULL);
+  domain = gtk_builder_get_translation_domain (builder);
+  g_assert (domain == NULL);
+  g_object_unref (builder);
+  
+  builder = builder_new_from_string (buffer1, -1, "domain-1");
+  domain = gtk_builder_get_translation_domain (builder);
+  g_assert (domain);
+  g_assert (strcmp (domain, "domain-1") == 0);
+  g_object_unref (builder);
+  
+  builder = builder_new_from_string (buffer2, -1, NULL);
+  domain = gtk_builder_get_translation_domain (builder);
+  g_assert (domain == NULL);
+  g_object_unref (builder);
+  
+  builder = builder_new_from_string (buffer2, -1, "domain-1");
+  domain = gtk_builder_get_translation_domain (builder);
+  g_assert (domain);
+  g_assert (strcmp (domain, "domain-1") == 0);
+  g_object_unref (builder);
+}
+
+#if 0
+static void
+test_translation (void)
+{
+  GtkBuilder *builder;
+  const gchar buffer[] =
+    "<interface>"
+    "  <object class=\"GtkWindow\" id=\"window1\">"
+    "    <child>"
+    "      <object class=\"GtkLabel\" id=\"label\">"
+    "        <property name=\"label\" translatable=\"yes\">File</property>"
+    "      </object>"
+    "    </child>"
+    "  </object>"
+    "</interface>";
+  GtkLabel *window, *label;
+
+  setlocale (LC_ALL, "sv_SE");
+  textdomain ("builder");
+  bindtextdomain ("builder", "tests");
+
+  builder = builder_new_from_string (buffer, -1, NULL);
+  label = GTK_LABEL (gtk_builder_get_object (builder, "label"));
+  g_assert (strcmp (gtk_label_get_text (label), "Arkiv") == 0);
+
+  window = gtk_builder_get_object (builder, "window1");
+  gtk_widget_destroy (GTK_WIDGET (window));
+  g_object_unref (builder);
+}
+#endif
+
+static void
+test_sizegroup (void)
+{
+  GtkBuilder * builder;
+  const gchar buffer1[] =
+    "<interface domain=\"test\">"
+    "  <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
+    "    <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
+    "    <widgets>"
+    "      <widget name=\"radio1\"/>"
+    "      <widget name=\"radio2\"/>"
+    "    </widgets>"
+    "  </object>"
+    "  <object class=\"GtkWindow\" id=\"window1\">"
+    "    <child>"
+    "      <object class=\"GtkVBox\" id=\"vbox1\">"
+    "        <child>"
+    "          <object class=\"GtkRadioButton\" id=\"radio1\"/>"
+    "        </child>"
+    "        <child>"
+    "          <object class=\"GtkRadioButton\" id=\"radio2\"/>"
+    "        </child>"
+    "      </object>"
+    "    </child>"
+    "  </object>"
+    "</interface>";
+  const gchar buffer2[] =
+    "<interface domain=\"test\">"
+    "  <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
+    "    <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
+    "    <widgets>"
+    "    </widgets>"
+    "   </object>"
+    "</interface>";
+  const gchar buffer3[] =
+    "<interface domain=\"test\">"
+    "  <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
+    "    <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
+    "    <widgets>"
+    "      <widget name=\"radio1\"/>"
+    "      <widget name=\"radio2\"/>"
+    "    </widgets>"
+    "  </object>"
+    "  <object class=\"GtkSizeGroup\" id=\"sizegroup2\">"
+    "    <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
+    "    <widgets>"
+    "      <widget name=\"radio1\"/>"
+    "      <widget name=\"radio2\"/>"
+    "    </widgets>"
+    "  </object>"
+    "  <object class=\"GtkWindow\" id=\"window1\">"
+    "    <child>"
+    "      <object class=\"GtkVBox\" id=\"vbox1\">"
+    "        <child>"
+    "          <object class=\"GtkRadioButton\" id=\"radio1\"/>"
+    "        </child>"
+    "        <child>"
+    "          <object class=\"GtkRadioButton\" id=\"radio2\"/>"
+    "        </child>"
+    "      </object>"
+    "    </child>"
+    "  </object>"
+    "</interface>";
+  GObject *sizegroup;
+  GSList *widgets;
+
+  builder = builder_new_from_string (buffer1, -1, NULL);
+  sizegroup = gtk_builder_get_object (builder, "sizegroup1");
+  widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
+  g_assert (g_slist_length (widgets) == 2);
+  g_slist_free (widgets);
+  g_object_unref (builder);
+
+  builder = builder_new_from_string (buffer2, -1, NULL);
+  sizegroup = gtk_builder_get_object (builder, "sizegroup1");
+  widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
+  g_assert (g_slist_length (widgets) == 0);
+  g_slist_free (widgets);
+  g_object_unref (builder);
+
+  builder = builder_new_from_string (buffer3, -1, NULL);
+  sizegroup = gtk_builder_get_object (builder, "sizegroup1");
+  widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
+  g_assert (g_slist_length (widgets) == 2);
+  g_slist_free (widgets);
+  sizegroup = gtk_builder_get_object (builder, "sizegroup2");
+  widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
+  g_assert (g_slist_length (widgets) == 2);
+  g_slist_free (widgets);
+
+#if 0
+  {
+    GObject *window;
+    window = gtk_builder_get_object (builder, "window1");
+    gtk_widget_destroy (GTK_WIDGET (window));
+  }
+#endif  
+  g_object_unref (builder);
+}
+
+static void
+test_list_store (void)
+{
+  const gchar buffer1[] =
+    "<interface>"
+    "  <object class=\"GtkListStore\" id=\"liststore1\">"
+    "    <columns>"
+    "      <column type=\"gchararray\"/>"
+    "      <column type=\"guint\"/>"
+    "    </columns>"
+    "  </object>"
+    "</interface>";
+  const char buffer2[] = 
+    "<interface>"
+    "  <object class=\"GtkListStore\" id=\"liststore1\">"
+    "    <columns>"
+    "      <column type=\"gchararray\"/>"
+    "      <column type=\"gchararray\"/>"
+    "      <column type=\"gint\"/>"
+    "    </columns>"
+    "    <data>"
+    "      <row>"
+    "        <col id=\"0\" translatable=\"yes\">John</col>"
+    "        <col id=\"1\" context=\"foo\">Doe</col>"
+    "        <col id=\"2\" comment=\"foobar\">25</col>"
+    "      </row>"
+    "      <row>"
+    "        <col id=\"0\">Johan</col>"
+    "        <col id=\"1\">Dole</col>"
+    "        <col id=\"2\">50</col>"
+    "      </row>"
+    "    </data>"
+    "  </object>"
+    "</interface>";
+  const char buffer3[] = 
+    "<interface>"
+    "  <object class=\"GtkListStore\" id=\"liststore1\">"
+    "    <columns>"
+    "      <column type=\"gchararray\"/>"
+    "      <column type=\"gchararray\"/>"
+    "      <column type=\"gint\"/>"
+    "    </columns>"
+    "    <data>"
+    "      <row>"
+    "        <col id=\"1\" context=\"foo\">Doe</col>"
+    "        <col id=\"0\" translatable=\"yes\">John</col>"
+    "        <col id=\"2\" comment=\"foobar\">25</col>"
+    "      </row>"
+    "      <row>"
+    "        <col id=\"2\">50</col>"
+    "        <col id=\"1\">Dole</col>"
+    "        <col id=\"0\">Johan</col>"
+    "      </row>"
+    "      <row>"
+    "        <col id=\"2\">19</col>"
+    "      </row>"
+    "    </data>"
+    "  </object>"
+    "</interface>";
+  GtkBuilder *builder;
+  GObject *store;
+  GtkTreeIter iter;
+  gchar *surname, *lastname;
+  int age;
+  
+  builder = builder_new_from_string (buffer1, -1, NULL);
+  store = gtk_builder_get_object (builder, "liststore1");
+  g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 2);
+  g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
+  g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_UINT);
+  g_object_unref (builder);
+  
+  builder = builder_new_from_string (buffer2, -1, NULL);
+  store = gtk_builder_get_object (builder, "liststore1");
+  g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 3);
+  g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
+  g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_STRING);
+  g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2) == G_TYPE_INT);
+  
+  g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter) == TRUE);
+  gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
+                      0, &surname,
+                      1, &lastname,
+                      2, &age,
+                      -1);
+  g_assert (surname != NULL);
+  g_assert (strcmp (surname, "John") == 0);
+  g_free (surname);
+  g_assert (lastname != NULL);
+  g_assert (strcmp (lastname, "Doe") == 0);
+  g_free (lastname);
+  g_assert (age == 25);
+  g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE);
+  
+  gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
+                      0, &surname,
+                      1, &lastname,
+                      2, &age,
+                      -1);
+  g_assert (surname != NULL);
+  g_assert (strcmp (surname, "Johan") == 0);
+  g_free (surname);
+  g_assert (lastname != NULL);
+  g_assert (strcmp (lastname, "Dole") == 0);
+  g_free (lastname);
+  g_assert (age == 50);
+  g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == FALSE);
+  
+  builder = builder_new_from_string (buffer3, -1, NULL);
+  store = gtk_builder_get_object (builder, "liststore1");
+  g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 3);
+  g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
+  g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_STRING);
+  g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2) == G_TYPE_INT);
+  
+  g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter) == TRUE);
+  gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
+                      0, &surname,
+                      1, &lastname,
+                      2, &age,
+                      -1);
+  g_assert (surname != NULL);
+  g_assert (strcmp (surname, "John") == 0);
+  g_free (surname);
+  g_assert (lastname != NULL);
+  g_assert (strcmp (lastname, "Doe") == 0);
+  g_free (lastname);
+  g_assert (age == 25);
+  g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE);
+  
+  gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
+                      0, &surname,
+                      1, &lastname,
+                      2, &age,
+                      -1);
+  g_assert (surname != NULL);
+  g_assert (strcmp (surname, "Johan") == 0);
+  g_free (surname);
+  g_assert (lastname != NULL);
+  g_assert (strcmp (lastname, "Dole") == 0);
+  g_free (lastname);
+  g_assert (age == 50);
+  g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE);
+  
+  gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
+                      0, &surname,
+                      1, &lastname,
+                      2, &age,
+                      -1);
+  g_assert (surname == NULL);
+  g_assert (lastname == NULL);
+  g_assert (age == 19);
+  g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == FALSE);
+
+  g_object_unref (builder);
+}
+
+static void
+test_tree_store (void)
+{
+  const gchar buffer[] =
+    "<interface domain=\"test\">"
+    "  <object class=\"GtkTreeStore\" id=\"treestore1\">"
+    "    <columns>"
+    "      <column type=\"gchararray\"/>"
+    "      <column type=\"guint\"/>"
+    "    </columns>"
+    "  </object>"
+    "</interface>";
+  GtkBuilder *builder;
+  GObject *store;
+  
+  builder = builder_new_from_string (buffer, -1, NULL);
+  store = gtk_builder_get_object (builder, "treestore1");
+  g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 2);
+  g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
+  g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_UINT);
+  
+  g_object_unref (builder);
+}
+
+static void
+test_types (void)
+{
+  const gchar buffer[] = 
+    "<interface>"
+    "  <object class=\"GtkAction\" id=\"action\"/>"
+    "  <object class=\"GtkActionGroup\" id=\"actiongroup\"/>"
+    "  <object class=\"GtkAlignment\" id=\"alignment\"/>"
+    "  <object class=\"GtkArrow\" id=\"arrow\"/>"
+    "  <object class=\"GtkButton\" id=\"button\"/>"
+    "  <object class=\"GtkCheckButton\" id=\"checkbutton\"/>"
+    "  <object class=\"GtkDialog\" id=\"dialog\"/>"
+    "  <object class=\"GtkDrawingArea\" id=\"drawingarea\"/>"
+    "  <object class=\"GtkEventBox\" id=\"eventbox\"/>"
+    "  <object class=\"GtkEntry\" id=\"entry\"/>"
+    "  <object class=\"GtkFontButton\" id=\"fontbutton\"/>"
+    "  <object class=\"GtkHButtonBox\" id=\"hbuttonbox\"/>"
+    "  <object class=\"GtkHBox\" id=\"hbox\"/>"
+    "  <object class=\"GtkHPaned\" id=\"hpaned\"/>"
+    "  <object class=\"GtkHRuler\" id=\"hruler\"/>"
+    "  <object class=\"GtkHScale\" id=\"hscale\"/>"
+    "  <object class=\"GtkHScrollbar\" id=\"hscrollbar\"/>"
+    "  <object class=\"GtkHSeparator\" id=\"hseparator\"/>"
+    "  <object class=\"GtkImage\" id=\"image\"/>"
+    "  <object class=\"GtkLabel\" id=\"label\"/>"
+    "  <object class=\"GtkListStore\" id=\"liststore\"/>"
+    "  <object class=\"GtkMenuBar\" id=\"menubar\"/>"
+    "  <object class=\"GtkNotebook\" id=\"notebook\"/>"
+    "  <object class=\"GtkProgressBar\" id=\"progressbar\"/>"
+    "  <object class=\"GtkRadioButton\" id=\"radiobutton\"/>"
+    "  <object class=\"GtkSizeGroup\" id=\"sizegroup\"/>"
+    "  <object class=\"GtkScrolledWindow\" id=\"scrolledwindow\"/>"
+    "  <object class=\"GtkSpinButton\" id=\"spinbutton\"/>"
+    "  <object class=\"GtkStatusbar\" id=\"statusbar\"/>"
+    "  <object class=\"GtkTextView\" id=\"textview\"/>"
+    "  <object class=\"GtkToggleAction\" id=\"toggleaction\"/>"
+    "  <object class=\"GtkToggleButton\" id=\"togglebutton\"/>"
+    "  <object class=\"GtkToolbar\" id=\"toolbar\"/>"
+    "  <object class=\"GtkTreeStore\" id=\"treestore\"/>"
+    "  <object class=\"GtkTreeView\" id=\"treeview\"/>"
+    "  <object class=\"GtkTable\" id=\"table\"/>"
+    "  <object class=\"GtkVBox\" id=\"vbox\"/>"
+    "  <object class=\"GtkVButtonBox\" id=\"vbuttonbox\"/>"
+    "  <object class=\"GtkVScrollbar\" id=\"vscrollbar\"/>"
+    "  <object class=\"GtkVSeparator\" id=\"vseparator\"/>"
+    "  <object class=\"GtkViewport\" id=\"viewport\"/>"
+    "  <object class=\"GtkVRuler\" id=\"vruler\"/>"
+    "  <object class=\"GtkVPaned\" id=\"vpaned\"/>"
+    "  <object class=\"GtkVScale\" id=\"vscale\"/>"
+    "  <object class=\"GtkWindow\" id=\"window\"/>"
+    "  <object class=\"GtkUIManager\" id=\"uimanager\"/>"
+    "</interface>";
+  const gchar buffer2[] = 
+    "<interface>"
+    "  <object type-func=\"gtk_window_get_type\" id=\"window\"/>"
+    "</interface>";
+  const gchar buffer3[] = 
+    "<interface>"
+    "  <object type-func=\"xxx_invalid_get_type_function\" id=\"window\"/>"
+    "</interface>";
+  GtkBuilder *builder;
+  GObject *window;
+  GError *error;
+
+  builder = builder_new_from_string (buffer, -1, NULL);
+  gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "dialog")));
+  gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "window")));
+  g_object_unref (builder);
+
+  builder = builder_new_from_string (buffer2, -1, NULL);
+  window = gtk_builder_get_object (builder, "window");
+  g_assert (window != NULL);
+  g_assert (GTK_IS_WINDOW (window));
+  gtk_widget_destroy (GTK_WIDGET (window));
+  g_object_unref (builder);
+  
+  error = NULL;
+  builder = gtk_builder_new ();
+  gtk_builder_add_from_string (builder, buffer3, -1, &error);
+  g_assert (error != NULL);
+  g_assert (error->domain == GTK_BUILDER_ERROR);
+  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_TYPE_FUNCTION);
+  g_error_free (error);
+  g_object_unref (builder);
+}
+
+static void
+test_spin_button (void)
+{
+  GtkBuilder *builder;
+  const gchar buffer[] =
+    "<interface>"
+    "<object class=\"GtkAdjustment\" id=\"adjustment1\">"
+    "<property name=\"lower\">0</property>"
+    "<property name=\"upper\">10</property>"
+    "<property name=\"step-increment\">2</property>"
+    "<property name=\"page-increment\">3</property>"
+    "<property name=\"page-size\">5</property>"
+    "<property name=\"value\">1</property>"
+    "</object>"
+    "<object class=\"GtkSpinButton\" id=\"spinbutton1\">"
+    "<property name=\"visible\">True</property>"
+    "<property name=\"adjustment\">adjustment1</property>"
+    "</object>"
+    "</interface>";
+  GObject *object;
+  GtkAdjustment *adjustment;
+  gdouble value;
+  
+  builder = builder_new_from_string (buffer, -1, NULL);
+  object = gtk_builder_get_object (builder, "spinbutton1");
+  g_assert (GTK_IS_SPIN_BUTTON (object));
+  adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (object));
+  g_assert (GTK_IS_ADJUSTMENT (adjustment));
+  g_object_get (adjustment, "value", &value, NULL);
+  g_assert (value == 1);
+  g_object_get (adjustment, "lower", &value, NULL);
+  g_assert (value == 0);
+  g_object_get (adjustment, "upper", &value, NULL);
+  g_assert (value == 10);
+  g_object_get (adjustment, "step-increment", &value, NULL);
+  g_assert (value == 2);
+  g_object_get (adjustment, "page-increment", &value, NULL);
+  g_assert (value == 3);
+  g_object_get (adjustment, "page-size", &value, NULL);
+  g_assert (value == 5);
+  
+  g_object_unref (builder);
+}
+
+static void
+test_notebook (void)
+{
+  GtkBuilder *builder;
+  const gchar buffer[] =
+    "<interface>"
+    "  <object class=\"GtkNotebook\" id=\"notebook1\">"
+    "    <child>"
+    "      <object class=\"GtkLabel\" id=\"label1\">"
+    "        <property name=\"label\">label1</property>"
+    "      </object>"
+    "    </child>"
+    "    <child type=\"tab\">"
+    "      <object class=\"GtkLabel\" id=\"tablabel1\">"
+    "        <property name=\"label\">tab_label1</property>"
+    "      </object>"
+    "    </child>"
+    "    <child>"
+    "      <object class=\"GtkLabel\" id=\"label2\">"
+    "        <property name=\"label\">label2</property>"
+    "      </object>"
+    "    </child>"
+    "    <child type=\"tab\">"
+    "      <object class=\"GtkLabel\" id=\"tablabel2\">"
+    "        <property name=\"label\">tab_label2</property>"
+    "      </object>"
+    "    </child>"
+    "  </object>"
+    "</interface>";
+  GObject *notebook;
+  GtkWidget *label;
+
+  builder = builder_new_from_string (buffer, -1, NULL);
+  notebook = gtk_builder_get_object (builder, "notebook1");
+  g_assert (notebook != NULL);
+  g_assert (gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook)) == 2);
+
+  label = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 0);
+  g_assert (GTK_IS_LABEL (label));
+  g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "label1") == 0);
+  label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (notebook), label);
+  g_assert (GTK_IS_LABEL (label));
+  g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "tab_label1") == 0);
+
+  label = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 1);
+  g_assert (GTK_IS_LABEL (label));
+  g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "label2") == 0);
+  label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (notebook), label);
+  g_assert (GTK_IS_LABEL (label));
+  g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "tab_label2") == 0);
+
+  g_object_unref (builder);
+}
+
+static void
+test_construct_only_property (void)
+{
+  GtkBuilder *builder;
+  const gchar buffer[] =
+    "<interface>"
+    "  <object class=\"GtkWindow\" id=\"window1\">"
+    "    <property name=\"type\">GTK_WINDOW_POPUP</property>"
+    "  </object>"
+    "</interface>";
+  const gchar buffer2[] =
+    "<interface>"
+    "  <object class=\"GtkTextTagTable\" id=\"tagtable1\"/>"
+    "  <object class=\"GtkTextBuffer\" id=\"textbuffer1\">"
+    "    <property name=\"tag-table\">tagtable1</property>"
+    "  </object>"
+    "</interface>";
+  GObject *widget, *tagtable, *textbuffer;
+  GtkWindowType type;
+  
+  builder = builder_new_from_string (buffer, -1, NULL);
+  widget = gtk_builder_get_object (builder, "window1");
+  g_object_get (widget, "type", &type, NULL);
+  g_assert (type == GTK_WINDOW_POPUP);
+
+  gtk_widget_destroy (GTK_WIDGET (widget));
+  g_object_unref (builder);
+
+  builder = builder_new_from_string (buffer2, -1, NULL);
+  textbuffer = gtk_builder_get_object (builder, "textbuffer1");
+  g_assert (textbuffer != NULL);
+  g_object_get (textbuffer, "tag-table", &tagtable, NULL);
+  g_assert (tagtable == gtk_builder_get_object (builder, "tagtable1"));
+  g_object_unref (tagtable);
+  g_object_unref (builder);
+}
+
+static void
+test_object_properties (void)
+{
+  GtkBuilder *builder;
+  const gchar buffer[] =
+    "<interface>"
+    "  <object class=\"GtkWindow\" id=\"window1\">"
+    "    <child>"
+    "      <object class=\"GtkVBox\" id=\"vbox\">"
+    "        <property name=\"border-width\">10</property>"
+    "        <child>"
+    "          <object class=\"GtkLabel\" id=\"label1\">"
+    "            <property name=\"mnemonic-widget\">spinbutton1</property>"
+    "          </object>"
+    "        </child>"
+    "        <child>"
+    "          <object class=\"GtkSpinButton\" id=\"spinbutton1\"/>"
+    "        </child>"
+    "      </object>"
+    "    </child>"
+    "  </object>"
+    "</interface>";
+  const gchar buffer2[] =
+    "<interface>"
+    "  <object class=\"GtkWindow\" id=\"window2\"/>"
+    "</interface>";
+  GObject *label, *spinbutton, *window;
+  
+  builder = builder_new_from_string (buffer, -1, NULL);
+  label = gtk_builder_get_object (builder, "label1");
+  g_assert (label != NULL);
+  spinbutton = gtk_builder_get_object (builder, "spinbutton1");
+  g_assert (spinbutton != NULL);
+  g_assert (spinbutton == (GObject*)gtk_label_get_mnemonic_widget (GTK_LABEL (label)));
+
+  gtk_builder_add_from_string (builder, buffer2, -1, NULL);
+  window = gtk_builder_get_object (builder, "window2");
+  g_assert (window != NULL);
+  gtk_widget_destroy (GTK_WIDGET (window));
+
+  g_object_unref (builder);
+}
+
+static void
+test_children (void)
+{
+  GtkBuilder * builder;
+  GList *children;
+  const gchar buffer1[] =
+    "<interface>"
+    "  <object class=\"GtkWindow\" id=\"window1\">"
+    "    <child>"
+    "      <object class=\"GtkButton\" id=\"button1\">"
+    "        <property name=\"label\">Hello</property>"
+    "      </object>"
+    "    </child>"
+    "  </object>"
+    "</interface>";
+  const gchar buffer2[] =
+    "<interface>"
+    "  <object class=\"GtkDialog\" id=\"dialog1\">"
+    "    <child internal-child=\"vbox\">"
+    "      <object class=\"GtkVBox\" id=\"dialog1-vbox\">"
+    "        <property name=\"border-width\">10</property>"
+    "          <child internal-child=\"action_area\">"
+    "            <object class=\"GtkHButtonBox\" id=\"dialog1-action_area\">"
+    "              <property name=\"border-width\">20</property>"
+    "            </object>"
+    "          </child>"
+    "      </object>"
+    "    </child>"
+    "  </object>"
+    "</interface>";
+
+  GObject *window, *button;
+  GObject *dialog, *vbox, *action_area;
+  
+  builder = builder_new_from_string (buffer1, -1, NULL);
+  window = gtk_builder_get_object (builder, "window1");
+  g_assert (window != NULL);
+  g_assert (GTK_IS_WINDOW (window));
+
+  button = gtk_builder_get_object (builder, "button1");
+  g_assert (button != NULL);
+  g_assert (GTK_IS_BUTTON (button));
+  g_assert (strcmp (GTK_WIDGET (GTK_WIDGET (button)->parent)->name, "window1") == 0);
+
+  gtk_widget_destroy (GTK_WIDGET (window));
+  g_object_unref (builder);
+  
+  builder = builder_new_from_string (buffer2, -1, NULL);
+  dialog = gtk_builder_get_object (builder, "dialog1");
+  g_assert (dialog != NULL);
+  g_assert (GTK_IS_DIALOG (dialog));
+  children = gtk_container_get_children (GTK_CONTAINER (dialog));
+  g_assert (g_list_length (children) == 1);
+  g_list_free (children);
+  
+  vbox = gtk_builder_get_object (builder, "dialog1-vbox");
+  g_assert (vbox != NULL);
+  g_assert (GTK_IS_VBOX (vbox));
+  g_assert (GTK_WIDGET (vbox)->parent != NULL);
+  g_assert (strcmp (GTK_WIDGET (GTK_WIDGET (vbox)->parent)->name, "dialog1") == 0);
+  g_assert (GTK_CONTAINER (vbox)->border_width == 10);
+  g_assert (strcmp (GTK_WIDGET (GTK_DIALOG (dialog)->vbox)->name, "dialog1-vbox") == 0);
+
+  action_area = gtk_builder_get_object (builder, "dialog1-action_area");
+  g_assert (action_area != NULL);
+  g_assert (GTK_IS_HBUTTON_BOX (action_area));
+  g_assert (GTK_WIDGET (action_area)->parent != NULL);
+  g_assert (GTK_CONTAINER (action_area)->border_width == 20);
+  g_assert (GTK_DIALOG (dialog)->action_area != NULL);
+  g_assert (GTK_WIDGET (GTK_DIALOG (dialog)->action_area)->name != NULL);
+  g_assert (strcmp (GTK_WIDGET (GTK_DIALOG (dialog)->action_area)->name, "dialog1-action_area") == 0);
+  gtk_widget_destroy (GTK_WIDGET (dialog));
+  g_object_unref (builder);
+}
+
+static void
+test_child_properties (void)
+{
+  GtkBuilder * builder;
+  const gchar buffer1[] =
+    "<interface>"
+    "  <object class=\"GtkVBox\" id=\"vbox1\">"
+    "    <child>"
+    "      <object class=\"GtkLabel\" id=\"label1\"/>"
+    "      <packing>"
+    "        <property name=\"pack-type\">start</property>"
+    "      </packing>"
+    "    </child>"
+    "    <child>"
+    "      <object class=\"GtkLabel\" id=\"label2\"/>"
+    "      <packing>"
+    "        <property name=\"pack-type\">end</property>"
+    "      </packing>"
+    "    </child>"
+    "  </object>"
+    "</interface>";
+
+  GObject *label, *vbox;
+  GtkPackType pack_type;
+  
+  builder = builder_new_from_string (buffer1, -1, NULL);
+  vbox = gtk_builder_get_object (builder, "vbox1");
+  g_assert (GTK_IS_VBOX (vbox));
+
+  label = gtk_builder_get_object (builder, "label1");
+  g_assert (GTK_IS_LABEL (label));
+  gtk_container_child_get (GTK_CONTAINER (vbox),
+                           GTK_WIDGET (label),
+                           "pack-type",
+                           &pack_type,
+                           NULL);
+  g_assert (pack_type == GTK_PACK_START);
+  
+  label = gtk_builder_get_object (builder, "label2");
+  g_assert (GTK_IS_LABEL (label));
+  gtk_container_child_get (GTK_CONTAINER (vbox),
+                           GTK_WIDGET (label),
+                           "pack-type",
+                           &pack_type,
+                           NULL);
+  g_assert (pack_type == GTK_PACK_END);
+
+  g_object_unref (builder);
+}
+
+static void
+test_treeview_column (void)
+{
+  GtkBuilder *builder;
+  const gchar buffer[] =
+    "<interface>"
+    "<object class=\"GtkListStore\" id=\"liststore1\">"
+    "  <columns>"
+    "    <column type=\"gchararray\"/>"
+    "    <column type=\"guint\"/>"
+    "  </columns>"
+    "  <data>"
+    "    <row>"
+    "      <col id=\"0\">John</col>"
+    "      <col id=\"1\">25</col>"
+    "    </row>"
+    "  </data>"
+    "</object>"
+    "<object class=\"GtkWindow\" id=\"window1\">"
+    "  <child>"
+    "    <object class=\"GtkTreeView\" id=\"treeview1\">"
+    "      <property name=\"visible\">True</property>"
+    "      <property name=\"model\">liststore1</property>"
+    "      <child>"
+    "        <object class=\"GtkTreeViewColumn\" id=\"column1\">"
+    "          <property name=\"title\">Test</property>"
+    "          <child>"
+    "            <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
+    "            <attributes>"
+    "              <attribute name=\"text\">1</attribute>"
+    "            </attributes>"
+    "          </child>"
+    "        </object>"
+    "      </child>"
+    "      <child>"
+    "        <object class=\"GtkTreeViewColumn\" id=\"column2\">"
+    "          <property name=\"title\">Number</property>"
+    "          <child>"
+    "            <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
+    "            <attributes>"
+    "              <attribute name=\"text\">0</attribute>"
+    "            </attributes>"
+    "          </child>"
+    "        </object>"
+    "      </child>"
+    "    </object>"
+    "  </child>"
+    "</object>"
+    "</interface>";
+  GObject *window, *treeview;
+  GtkTreeViewColumn *column;
+  GList *renderers;
+  GObject *renderer;
+  gchar *text;
+
+  builder = builder_new_from_string (buffer, -1, NULL);
+  treeview = gtk_builder_get_object (builder, "treeview1");
+  g_assert (treeview);
+  g_assert (GTK_IS_TREE_VIEW (treeview));
+  column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), 0);
+  g_assert (GTK_IS_TREE_VIEW_COLUMN (column));
+  g_assert (strcmp (gtk_tree_view_column_get_title (column), "Test") == 0);
+
+  renderers = gtk_tree_view_column_get_cell_renderers (column);
+  g_assert (g_list_length (renderers) == 1);
+  renderer = g_list_nth_data (renderers, 0);
+  g_assert (renderer);
+  g_assert (GTK_IS_CELL_RENDERER_TEXT (renderer));
+  g_list_free (renderers);
+
+  gtk_widget_realize (GTK_WIDGET (treeview));
+
+  renderer = gtk_builder_get_object (builder, "renderer1");
+  g_object_get (renderer, "text", &text, NULL);
+  g_assert (text);
+  g_assert (strcmp (text, "25") == 0);
+  g_free (text);
+  
+  renderer = gtk_builder_get_object (builder, "renderer2");
+  g_object_get (renderer, "text", &text, NULL);
+  g_assert (text);
+  g_assert (strcmp (text, "John") == 0);
+  g_free (text);
+
+  gtk_widget_unrealize (GTK_WIDGET (treeview));
+
+  window = gtk_builder_get_object (builder, "window1");
+  gtk_widget_destroy (GTK_WIDGET (window));
+  
+  g_object_unref (builder);
+}
+
+static void
+test_icon_view (void)
+{
+  GtkBuilder *builder;
+  const gchar buffer[] =
+    "<interface>"
+    "  <object class=\"GtkListStore\" id=\"liststore1\">"
+    "    <columns>"
+    "      <column type=\"gchararray\"/>"
+    "      <column type=\"GdkPixbuf\"/>"
+    "    </columns>"
+    "    <data>"
+    "      <row>"
+    "        <col id=\"0\">test</col>"
+    "      </row>"
+    "    </data>"
+    "  </object>"
+    "  <object class=\"GtkWindow\" id=\"window1\">"
+    "    <child>"
+    "      <object class=\"GtkIconView\" id=\"iconview1\">"
+    "        <property name=\"model\">liststore1</property>"
+    "        <property name=\"text-column\">0</property>"
+    "        <property name=\"pixbuf-column\">1</property>"
+    "        <property name=\"visible\">True</property>"
+    "        <child>"
+    "          <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
+    "          <attributes>"
+    "            <attribute name=\"text\">0</attribute>"
+    "          </attributes>"
+    "        </child>"
+    "      </object>"
+    "    </child>"
+    "  </object>"
+    "</interface>";
+  GObject *window, *iconview, *renderer;
+  gchar *text;
+  
+  builder = builder_new_from_string (buffer, -1, NULL);
+  iconview = gtk_builder_get_object (builder, "iconview1");
+  g_assert (iconview);
+  g_assert (GTK_IS_ICON_VIEW (iconview));
+
+  gtk_widget_realize (GTK_WIDGET (iconview));
+
+  renderer = gtk_builder_get_object (builder, "renderer1");
+  g_object_get (renderer, "text", &text, NULL);
+  g_assert (text);
+  g_assert (strcmp (text, "test") == 0);
+  g_free (text);
+    
+  window = gtk_builder_get_object (builder, "window1");
+  gtk_widget_destroy (GTK_WIDGET (window));
+  g_object_unref (builder);
+}
+
+static void
+test_combo_box (void)
+{
+  GtkBuilder *builder;
+  const gchar buffer[] =
+    "<interface>"
+    "  <object class=\"GtkListStore\" id=\"liststore1\">"
+    "    <columns>"
+    "      <column type=\"guint\"/>"
+    "      <column type=\"gchararray\"/>"
+    "    </columns>"
+    "    <data>"
+    "      <row>"
+    "        <col id=\"0\">1</col>"
+    "        <col id=\"1\">Foo</col>"
+    "      </row>"
+    "      <row>"
+    "        <col id=\"0\">2</col>"
+    "        <col id=\"1\">Bar</col>"
+    "      </row>"
+    "    </data>"
+    "  </object>"
+    "  <object class=\"GtkWindow\" id=\"window1\">"
+    "    <child>"
+    "      <object class=\"GtkComboBox\" id=\"combobox1\">"
+    "        <property name=\"model\">liststore1</property>"
+    "        <property name=\"visible\">True</property>"
+    "        <child>"
+    "          <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
+    "          <attributes>"
+    "            <attribute name=\"text\">0</attribute>"
+    "          </attributes>"
+    "        </child>"
+    "        <child>"
+    "          <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
+    "          <attributes>"
+    "            <attribute name=\"text\">1</attribute>"
+    "          </attributes>"
+    "        </child>"
+    "      </object>"
+    "    </child>"
+    "  </object>"
+    "</interface>";
+  GObject *window, *combobox, *renderer;
+  gchar *text;
+
+  builder = builder_new_from_string (buffer, -1, NULL);
+  combobox = gtk_builder_get_object (builder, "combobox1");
+  g_assert (combobox);
+  gtk_widget_realize (GTK_WIDGET (combobox));
+
+  renderer = gtk_builder_get_object (builder, "renderer2");
+  g_assert (renderer);
+  g_object_get (renderer, "text", &text, NULL);
+  g_assert (text);
+  g_assert (strcmp (text, "Bar") == 0);
+  g_free (text);
+
+  renderer = gtk_builder_get_object (builder, "renderer1");
+  g_assert (renderer);
+  g_object_get (renderer, "text", &text, NULL);
+  g_assert (text);
+  g_assert (strcmp (text, "2") == 0);
+  g_free (text);
+
+  window = gtk_builder_get_object (builder, "window1");
+  gtk_widget_destroy (GTK_WIDGET (window));
+
+  g_object_unref (builder);
+}
+
+static void
+test_combo_box_entry (void)
+{
+  GtkBuilder *builder;
+  const gchar buffer[] =
+    "<interface>"
+    "  <object class=\"GtkListStore\" id=\"liststore1\">"
+    "    <columns>"
+    "      <column type=\"guint\"/>"
+    "      <column type=\"gchararray\"/>"
+    "    </columns>"
+    "    <data>"
+    "      <row>"
+    "        <col id=\"0\">1</col>"
+    "        <col id=\"1\">Foo</col>"
+    "      </row>"
+    "      <row>"
+    "        <col id=\"0\">2</col>"
+    "        <col id=\"1\">Bar</col>"
+    "      </row>"
+    "    </data>"
+    "  </object>"
+    "  <object class=\"GtkWindow\" id=\"window1\">"
+    "    <child>"
+    "      <object class=\"GtkComboBoxEntry\" id=\"comboboxentry1\">"
+    "        <property name=\"model\">liststore1</property>"
+    "        <property name=\"visible\">True</property>"
+    "        <child>"
+    "          <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
+    "            <attributes>"
+    "              <attribute name=\"text\">0</attribute>"
+    "            </attributes>"
+    "        </child>"
+    "        <child>"
+    "          <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
+    "            <attributes>"
+    "              <attribute name=\"text\">1</attribute>"
+    "            </attributes>"
+    "        </child>"
+    "      </object>"
+    "    </child>"
+    "  </object>"
+    "</interface>";
+  GObject *window, *combobox, *renderer;
+  gchar *text;
+
+  builder = builder_new_from_string (buffer, -1, NULL);
+  combobox = gtk_builder_get_object (builder, "comboboxentry1");
+  g_assert (combobox);
+
+  renderer = gtk_builder_get_object (builder, "renderer2");
+  g_assert (renderer);
+  g_object_get (renderer, "text", &text, NULL);
+  g_assert (text);
+  g_assert (strcmp (text, "Bar") == 0);
+  g_free (text);
+
+  renderer = gtk_builder_get_object (builder, "renderer1");
+  g_assert (renderer);
+  g_object_get (renderer, "text", &text, NULL);
+  g_assert (text);
+  g_assert (strcmp (text, "2") == 0);
+  g_free (text);
+
+  window = gtk_builder_get_object (builder, "window1");
+  gtk_widget_destroy (GTK_WIDGET (window));
+
+  g_object_unref (builder);
+}
+
+static void
+test_cell_view (void)
+{
+  GtkBuilder *builder;
+  gchar *buffer =
+    "<interface>"
+    "  <object class=\"GtkListStore\" id=\"liststore1\">"
+    "    <columns>"
+    "      <column type=\"gchararray\"/>"
+    "    </columns>"
+    "    <data>"
+    "      <row>"
+    "        <col id=\"0\">test</col>"
+    "      </row>"
+    "    </data>"
+    "  </object>"
+    "  <object class=\"GtkWindow\" id=\"window1\">"
+    "    <child>"
+    "      <object class=\"GtkCellView\" id=\"cellview1\">"
+    "        <property name=\"visible\">True</property>"
+    "        <property name=\"model\">liststore1</property>"
+    "        <child>"
+    "          <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
+    "          <attributes>"
+    "            <attribute name=\"text\">0</attribute>"
+    "          </attributes>"
+    "        </child>"
+    "      </object>"
+    "    </child>"
+    "  </object>"
+    "</interface>";
+  GObject *cellview;
+  GObject *model, *window;
+  GtkTreePath *path;
+  GList *renderers;
+  GObject *renderer;
+  gchar *text;
+  
+  builder = builder_new_from_string (buffer, -1, NULL);
+  cellview = gtk_builder_get_object (builder, "cellview1");
+  g_assert (builder);
+  g_assert (cellview);
+  g_assert (GTK_IS_CELL_VIEW (cellview));
+  g_object_get (cellview, "model", &model, NULL);
+  g_assert (model);
+  g_assert (GTK_IS_TREE_MODEL (model));
+  g_object_unref (model);
+  path = gtk_tree_path_new_first ();
+  gtk_cell_view_set_displayed_row (GTK_CELL_VIEW (cellview), path);
+  
+  renderers = gtk_cell_view_get_cell_renderers (GTK_CELL_VIEW (cellview));
+  g_assert (renderers);
+  g_assert (g_list_length (renderers) == 1);
+  
+  gtk_widget_realize (GTK_WIDGET (cellview));
+
+  renderer = g_list_nth_data (renderers, 0);
+  g_list_free (renderers);
+  g_assert (renderer);
+  g_object_get (renderer, "text", &text, NULL);
+  g_assert (strcmp (text, "test") == 0);
+  g_free (text);
+  gtk_tree_path_free (path);
+
+  window = gtk_builder_get_object (builder, "window1");
+  gtk_widget_destroy (GTK_WIDGET (window));
+  
+  g_object_unref (builder);
+}
+
+static void
+test_dialog (void)
+{
+  GtkBuilder * builder;
+  const gchar buffer1[] =
+    "<interface>"
+    "  <object class=\"GtkDialog\" id=\"dialog1\">"
+    "    <child internal-child=\"vbox\">"
+    "      <object class=\"GtkVBox\" id=\"dialog1-vbox\">"
+    "          <child internal-child=\"action_area\">"
+    "            <object class=\"GtkHButtonBox\" id=\"dialog1-action_area\">"
+    "              <child>"
+    "                <object class=\"GtkButton\" id=\"button_cancel\"/>"
+    "              </child>"
+    "              <child>"
+    "                <object class=\"GtkButton\" id=\"button_ok\"/>"
+    "              </child>"
+    "            </object>"
+    "          </child>"
+    "      </object>"
+    "    </child>"
+    "    <action-widgets>"
+    "      <action-widget response=\"3\">button_ok</action-widget>"
+    "      <action-widget response=\"-5\">button_cancel</action-widget>"
+    "    </action-widgets>"
+    "  </object>"
+    "</interface>";
+
+  GObject *dialog1;
+  GObject *button_ok;
+  GObject *button_cancel;
+  
+  builder = builder_new_from_string (buffer1, -1, NULL);
+  dialog1 = gtk_builder_get_object (builder, "dialog1");
+  button_ok = gtk_builder_get_object (builder, "button_ok");
+  g_assert (gtk_dialog_get_response_for_widget (GTK_DIALOG (dialog1), GTK_WIDGET (button_ok)) == 3);
+  button_cancel = gtk_builder_get_object (builder, "button_cancel");
+  g_assert (gtk_dialog_get_response_for_widget (GTK_DIALOG (dialog1), GTK_WIDGET (button_cancel)) == -5);
+  
+  gtk_widget_destroy (GTK_WIDGET (dialog1));
+  g_object_unref (builder);
+}
+
+static void
+test_accelerators (void)
+{
+  GtkBuilder *builder;
+  gchar *buffer =
+    "<interface>"
+    "  <object class=\"GtkWindow\" id=\"window1\">"
+    "    <child>"
+    "      <object class=\"GtkButton\" id=\"button1\">"
+    "        <accelerator key=\"q\" modifiers=\"GDK_CONTROL_MASK\" signal=\"clicked\"/>"
+    "      </object>"
+    "    </child>"
+    "  </object>"
+    "</interface>";
+  gchar *buffer2 =
+    "<interface>"
+    "  <object class=\"GtkWindow\" id=\"window1\">"
+    "    <child>"
+    "      <object class=\"GtkTreeView\" id=\"treeview1\">"
+    "        <signal name=\"cursor-changed\" handler=\"gtk_main_quit\"/>"
+    "        <accelerator key=\"f\" modifiers=\"GDK_CONTROL_MASK\" signal=\"grab_focus\"/>"
+    "      </object>"
+    "    </child>"
+    "  </object>"
+    "</interface>";
+  GObject *window1;
+  GSList *accel_groups;
+  GObject *accel_group;
+  
+  builder = builder_new_from_string (buffer, -1, NULL);
+  window1 = gtk_builder_get_object (builder, "window1");
+  g_assert (window1);
+  g_assert (GTK_IS_WINDOW (window1));
+
+  accel_groups = gtk_accel_groups_from_object (window1);
+  g_assert (g_slist_length (accel_groups) == 1);
+  accel_group = g_slist_nth_data (accel_groups, 0);
+  g_assert (accel_group);
+
+  gtk_widget_destroy (GTK_WIDGET (window1));
+  g_object_unref (builder);
+
+  builder = builder_new_from_string (buffer2, -1, NULL);
+  window1 = gtk_builder_get_object (builder, "window1");
+  g_assert (window1);
+  g_assert (GTK_IS_WINDOW (window1));
+
+  accel_groups = gtk_accel_groups_from_object (window1);
+  g_assert (g_slist_length (accel_groups) == 1);
+  accel_group = g_slist_nth_data (accel_groups, 0);
+  g_assert (accel_group);
+
+  gtk_widget_destroy (GTK_WIDGET (window1));
+  g_object_unref (builder);
+}
+
+static void
+test_widget (void)
+{
+  gchar *buffer =
+    "<interface>"
+    "  <object class=\"GtkWindow\" id=\"window1\">"
+    "    <child>"
+    "      <object class=\"GtkButton\" id=\"button1\">"
+    "         <property name=\"can-focus\">True</property>"
+    "         <property name=\"has-focus\">True</property>"
+    "      </object>"
+    "    </child>"
+    "  </object>"
+   "</interface>";
+  gchar *buffer2 =
+    "<interface>"
+    "  <object class=\"GtkWindow\" id=\"window1\">"
+    "    <child>"
+    "      <object class=\"GtkButton\" id=\"button1\">"
+    "         <property name=\"can-default\">True</property>"
+    "         <property name=\"has-default\">True</property>"
+    "      </object>"
+    "    </child>"
+    "  </object>"
+   "</interface>";
+  gchar *buffer3 =
+    "<interface>"
+    "  <object class=\"GtkWindow\" id=\"window1\">"
+    "    <child>"
+    "      <object class=\"GtkVBox\" id=\"vbox1\">"
+    "        <child>"
+    "          <object class=\"GtkLabel\" id=\"label1\">"
+    "            <child internal-child=\"accessible\">"
+    "              <object class=\"AtkObject\" id=\"a11y-label1\">"
+    "                <property name=\"AtkObject::accessible-name\">A Label</property>"
+    "              </object>"
+    "            </child>"
+    "            <accessibility>"
+    "              <relation target=\"button1\" type=\"label-for\"/>"
+    "            </accessibility>"
+    "          </object>"
+    "        </child>"
+    "        <child>"
+    "          <object class=\"GtkButton\" id=\"button1\">"
+    "            <accessibility>"
+    "              <action action_name=\"click\" description=\"Sliff\"/>"
+    "            </accessibility>"
+    "          </object>"
+    "        </child>"
+    "      </object>"
+    "    </child>"
+    "  </object>"
+    "</interface>";
+  GtkBuilder *builder;
+  GObject *window1, *button1, *label1;
+  AtkObject *accessible;
+  AtkRelationSet *relation_set;
+  AtkRelation *relation;
+  char *name;
+  
+  builder = builder_new_from_string (buffer, -1, NULL);
+  button1 = gtk_builder_get_object (builder, "button1");
+
+#if 0
+  g_assert (GTK_WIDGET_HAS_FOCUS (GTK_WIDGET (button1)));
+#endif
+  window1 = gtk_builder_get_object (builder, "window1");
+  gtk_widget_destroy (GTK_WIDGET (window1));
+  
+  g_object_unref (builder);
+  
+  builder = builder_new_from_string (buffer2, -1, NULL);
+  button1 = gtk_builder_get_object (builder, "button1");
+
+  g_assert (GTK_WIDGET_RECEIVES_DEFAULT (GTK_WIDGET (button1)));
+  
+  g_object_unref (builder);
+  
+  builder = builder_new_from_string (buffer3, -1, NULL);
+
+  window1 = gtk_builder_get_object (builder, "window1");
+  label1 = gtk_builder_get_object (builder, "label1");
+
+  accessible = gtk_widget_get_accessible (GTK_WIDGET (label1));
+  relation_set = atk_object_ref_relation_set (accessible);
+  g_return_if_fail (atk_relation_set_get_n_relations (relation_set) == 1);
+  relation = atk_relation_set_get_relation (relation_set, 0);
+  g_return_if_fail (relation != NULL);
+  g_return_if_fail (ATK_IS_RELATION (relation));
+  g_return_if_fail (atk_relation_get_relation_type (relation) != ATK_RELATION_LABELLED_BY);
+  g_object_unref (relation_set);
+
+  g_object_get (G_OBJECT (accessible), "accessible-name", &name, NULL);
+  g_return_if_fail (strcmp (name, "A Label") == 0);
+  g_free (name);
+  
+  gtk_widget_destroy (GTK_WIDGET (window1));
+  g_object_unref (builder);
+}
+
+static void
+test_window (void)
+{
+  gchar *buffer1 =
+    "<interface>"
+    "  <object class=\"GtkWindow\" id=\"window1\">"
+    "     <property name=\"title\"></property>"
+    "  </object>"
+   "</interface>";
+  gchar *buffer2 =
+    "<interface>"
+    "  <object class=\"GtkWindow\" id=\"window1\">"
+    "  </object>"
+   "</interface>";
+  GtkBuilder *builder;
+  GObject *window1;
+  gchar *title;
+  
+  builder = builder_new_from_string (buffer1, -1, NULL);
+  window1 = gtk_builder_get_object (builder, "window1");
+  g_object_get (window1, "title", &title, NULL);
+  g_assert (strcmp (title, "") == 0);
+  g_free (title);
+  gtk_widget_destroy (GTK_WIDGET (window1));
+  g_object_unref (builder);
+
+  builder = builder_new_from_string (buffer2, -1, NULL);
+  window1 = gtk_builder_get_object (builder, "window1");
+  gtk_widget_destroy (GTK_WIDGET (window1));
+  g_object_unref (builder);
+}
+
+static void
+test_value_from_string (void)
+{
+  GValue value = { 0 };
+  GError *error = NULL;
+  GtkBuilder *builder;
+
+  builder = gtk_builder_new ();
+  
+  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_STRING, "test", &value, &error));
+  g_assert (G_VALUE_HOLDS_STRING (&value));
+  g_assert (strcmp (g_value_get_string (&value), "test") == 0);
+  g_value_unset (&value);
+
+  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "true", &value, &error));
+  g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
+  g_assert (g_value_get_boolean (&value) == TRUE);
+  g_value_unset (&value);
+
+  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "false", &value, &error));
+  g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
+  g_assert (g_value_get_boolean (&value) == FALSE);
+  g_value_unset (&value);
+
+  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "yes", &value, &error));
+  g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
+  g_assert (g_value_get_boolean (&value) == TRUE);
+  g_value_unset (&value);
+
+  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "no", &value, &error));
+  g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
+  g_assert (g_value_get_boolean (&value) == FALSE);
+  g_value_unset (&value);
+
+  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "0", &value, &error));
+  g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
+  g_assert (g_value_get_boolean (&value) == FALSE);
+  g_value_unset (&value);
+
+  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "1", &value, &error));
+  g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
+  g_assert (g_value_get_boolean (&value) == TRUE);
+  g_value_unset (&value);
+
+  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "tRuE", &value, &error));
+  g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
+  g_assert (g_value_get_boolean (&value) == TRUE);
+  g_value_unset (&value);
+  
+  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "blaurgh", &value, &error) == FALSE);
+  g_assert (error != NULL);
+  g_value_unset (&value);
+  g_assert (error->domain == GTK_BUILDER_ERROR);
+  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
+  g_error_free (error);
+  error = NULL;
+
+  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "yess", &value, &error) == FALSE);
+  g_value_unset (&value);
+  g_assert (error->domain == GTK_BUILDER_ERROR);
+  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
+  g_error_free (error);
+  error = NULL;
+  
+  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "trueee", &value, &error) == FALSE);
+  g_value_unset (&value);
+  g_assert (error->domain == GTK_BUILDER_ERROR);
+  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
+  g_error_free (error);
+  error = NULL;
+  
+  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "", &value, &error) == FALSE);
+  g_value_unset (&value);
+  g_assert (error->domain == GTK_BUILDER_ERROR);
+  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
+  g_error_free (error);
+  error = NULL;
+  
+  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_INT, "12345", &value, &error));
+  g_assert (G_VALUE_HOLDS_INT (&value));
+  g_assert (g_value_get_int (&value) == 12345);
+  g_value_unset (&value);
+
+  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_LONG, "9912345", &value, &error));
+  g_assert (G_VALUE_HOLDS_LONG (&value));
+  g_assert (g_value_get_long (&value) == 9912345);
+  g_value_unset (&value);
+
+  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_UINT, "2345", &value, &error));
+  g_assert (G_VALUE_HOLDS_UINT (&value));
+  g_assert (g_value_get_uint (&value) == 2345);
+  g_value_unset (&value);
+
+  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_FLOAT, "1.454", &value, &error));
+  g_assert (G_VALUE_HOLDS_FLOAT (&value));
+  g_assert (fabs (g_value_get_float (&value) - 1.454) < 0.00001);
+  g_value_unset (&value);
+
+  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_FLOAT, "abc", &value, &error) == FALSE);
+  g_value_unset (&value);
+  g_assert (error->domain == GTK_BUILDER_ERROR);
+  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
+  g_error_free (error);
+  error = NULL;
+
+  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_INT, "/-+,abc", &value, &error) == FALSE);
+  g_value_unset (&value);
+  g_assert (error->domain == GTK_BUILDER_ERROR);
+  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
+  g_error_free (error);
+  error = NULL;
+
+  g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "toplevel", &value, &error) == TRUE);
+  g_assert (G_VALUE_HOLDS_ENUM (&value));
+  g_assert (g_value_get_enum (&value) == GTK_WINDOW_TOPLEVEL);
+  g_value_unset (&value);
+
+  g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "sliff", &value, &error) == FALSE);
+  g_value_unset (&value);
+  g_assert (error->domain == GTK_BUILDER_ERROR);
+  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
+  g_error_free (error);
+  error = NULL;
+  
+  g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WIDGET_FLAGS, "mapped", &value, &error) == TRUE);
+  g_assert (G_VALUE_HOLDS_FLAGS (&value));
+  g_assert (g_value_get_flags (&value) == GTK_MAPPED);
+  g_value_unset (&value);
+
+  g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WIDGET_FLAGS, "GTK_VISIBLE | GTK_REALIZED", &value, &error) == TRUE);
+  g_assert (G_VALUE_HOLDS_FLAGS (&value));
+  g_assert (g_value_get_flags (&value) == (GTK_VISIBLE | GTK_REALIZED));
+  g_value_unset (&value);
+  
+  g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "foobar", &value, &error) == FALSE);
+  g_value_unset (&value);
+  g_assert (error->domain == GTK_BUILDER_ERROR);
+  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
+  g_error_free (error);
+  error = NULL;
+  
+  g_object_unref (builder);
+}
+
+static gboolean model_freed = FALSE;
+
+static void
+model_weakref (gpointer data,
+               GObject *model)
+{
+  model_freed = TRUE;
+}
+
+static void
+test_reference_counting (void)
+{
+  GtkBuilder *builder;
+  const gchar buffer1[] =
+    "<interface>"
+    "  <object class=\"GtkListStore\" id=\"liststore1\"/>"
+    "  <object class=\"GtkListStore\" id=\"liststore2\"/>"
+    "  <object class=\"GtkWindow\" id=\"window1\">"
+    "    <child>"
+    "      <object class=\"GtkTreeView\" id=\"treeview1\">"
+    "        <property name=\"model\">liststore1</property>"
+    "      </object>"
+    "    </child>"
+    "  </object>"
+    "</interface>";
+  const gchar buffer2[] =
+    "<interface>"
+    "  <object class=\"GtkVBox\" id=\"vbox1\">"
+    "    <child>"
+    "      <object class=\"GtkLabel\" id=\"label1\"/>"
+    "      <packing>"
+    "        <property name=\"pack-type\">start</property>"
+    "      </packing>"
+    "    </child>"
+    "  </object>"
+    "</interface>";
+  GObject *window, *treeview, *model;
+  
+  builder = builder_new_from_string (buffer1, -1, NULL);
+  window = gtk_builder_get_object (builder, "window1");
+  treeview = gtk_builder_get_object (builder, "treeview1");
+  model = gtk_builder_get_object (builder, "liststore1");
+  g_object_unref (builder);
+
+  g_object_weak_ref (model, (GWeakNotify)model_weakref, NULL);
+
+  g_assert (model_freed == FALSE);
+  gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), NULL);
+  g_assert (model_freed == TRUE);
+  
+  gtk_widget_destroy (GTK_WIDGET (window));
+
+  builder = builder_new_from_string (buffer2, -1, NULL);
+  g_object_unref (builder);
+}
+
+static void
+test_icon_factory (void)
+{
+  GtkBuilder *builder;
+  const gchar buffer1[] =
+    "<interface>"
+    "  <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
+    "    <sources>"
+    "      <source stock-id=\"apple-red\" filename=\"apple-red.png\"/>"
+    "    </sources>"
+    "  </object>"
+    "</interface>";
+  const gchar buffer2[] =
+    "<interface>"
+    "  <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
+    "    <sources>"
+    "      <source stock-id=\"sliff\" direction=\"rtl\" state=\"active\""
+    "              size=\"menu\" filename=\"sloff.png\"/>"
+    "      <source stock-id=\"sliff\" direction=\"ltr\" state=\"selected\""
+    "              size=\"dnd\" filename=\"slurf.png\"/>"
+    "    </sources>"
+    "  </object>"
+    "</interface>";
+#if 0
+  const gchar buffer3[] =
+    "<interface>"
+    "  <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
+    "    <invalid/>"
+    "  </object>"
+    "</interface>";
+  const gchar buffer4[] =
+    "<interface>"
+    "  <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
+    "    <sources>"
+    "      <invalid/>"
+    "    </sources>"
+    "  </object>"
+    "</interface>";
+  const gchar buffer5[] =
+    "<interface>"
+    "  <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
+    "    <sources>"
+    "      <source/>"
+    "    </sources>"
+    "  </object>"
+    "</interface>";
+  GError *error = NULL;
+#endif  
+  GObject *factory;
+  GtkIconSet *icon_set;
+  GtkIconSource *icon_source;
+  GtkWidget *image;
+  
+  builder = builder_new_from_string (buffer1, -1, NULL);
+  factory = gtk_builder_get_object (builder, "iconfactory1");
+  g_assert (factory != NULL);
+
+  icon_set = gtk_icon_factory_lookup (GTK_ICON_FACTORY (factory), "apple-red");
+  g_assert (icon_set != NULL);
+  gtk_icon_factory_add_default (GTK_ICON_FACTORY (factory));
+  image = gtk_image_new_from_stock ("apple-red", GTK_ICON_SIZE_BUTTON);
+  g_assert (image != NULL);
+
+  builder = builder_new_from_string (buffer2, -1, NULL);
+  factory = gtk_builder_get_object (builder, "iconfactory1");
+  g_assert (factory != NULL);
+
+  icon_set = gtk_icon_factory_lookup (GTK_ICON_FACTORY (factory), "sliff");
+  g_assert (icon_set != NULL);
+  g_assert (g_slist_length (icon_set->sources) == 2);
+
+  icon_source = icon_set->sources->data;
+  g_assert (gtk_icon_source_get_direction (icon_source) == GTK_TEXT_DIR_RTL);
+  g_assert (gtk_icon_source_get_state (icon_source) == GTK_STATE_ACTIVE);
+  g_assert (gtk_icon_source_get_size (icon_source) == GTK_ICON_SIZE_MENU);
+  g_assert (g_str_has_suffix (gtk_icon_source_get_filename (icon_source), "sloff.png"));
+  
+  icon_source = icon_set->sources->next->data;
+  g_assert (gtk_icon_source_get_direction (icon_source) == GTK_TEXT_DIR_LTR);
+  g_assert (gtk_icon_source_get_state (icon_source) == GTK_STATE_SELECTED);
+  g_assert (gtk_icon_source_get_size (icon_source) == GTK_ICON_SIZE_DND);
+  g_assert (g_str_has_suffix (gtk_icon_source_get_filename (icon_source), "slurf.png"));
+
+  g_object_unref (builder);
+
+#if 0
+  error = NULL;
+  gtk_builder_add_from_string (builder, buffer3, -1, &error);
+  g_assert (error != NULL);
+  g_assert (error->domain == GTK_BUILDER_ERROR);
+  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_TAG);
+  g_error_free (error);
+
+  error = NULL;
+  gtk_builder_add_from_string (builder, buffer4, -1, &error);
+  g_assert (error != NULL);
+  g_assert (error->domain == GTK_BUILDER_ERROR);
+  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_TAG);
+  g_error_free (error);
+
+  error = NULL;
+  gtk_builder_add_from_string (builder, buffer5, -1, &error);
+  g_assert (error != NULL);
+  g_assert (error->domain == GTK_BUILDER_ERROR);
+  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_ATTRIBUTE);
+  g_error_free (error);
+#endif
+
+}
+
+typedef struct {
+  gboolean weight;
+  gboolean foreground;
+  gboolean underline;
+  gboolean size;
+  gboolean font_desc;
+  gboolean language;
+} FoundAttrs;
+
+static gboolean 
+filter_pango_attrs (PangoAttribute *attr, 
+                   gpointer        data)
+{
+  FoundAttrs *found = (FoundAttrs *)data;
+
+  if (attr->klass->type == PANGO_ATTR_WEIGHT)
+    found->weight = TRUE;
+  else if (attr->klass->type == PANGO_ATTR_FOREGROUND)
+    found->foreground = TRUE;
+  else if (attr->klass->type == PANGO_ATTR_UNDERLINE)
+    found->underline = TRUE;
+  /* Make sure optional start/end properties are working */
+  else if (attr->klass->type == PANGO_ATTR_SIZE && 
+          attr->start_index == 5 &&
+          attr->end_index   == 10)
+    found->size = TRUE;
+  else if (attr->klass->type == PANGO_ATTR_FONT_DESC)
+    found->font_desc = TRUE;
+  else if (attr->klass->type == PANGO_ATTR_LANGUAGE)
+    found->language = TRUE;
+
+  return TRUE;
+}
+
+static void
+test_pango_attributes (void)
+{
+  GtkBuilder *builder;
+  FoundAttrs found = { 0, };
+  const gchar buffer[] =
+    "<interface>"
+    "  <object class=\"GtkLabel\" id=\"label1\">"
+    "    <attributes>"
+    "      <attribute name=\"weight\" value=\"PANGO_WEIGHT_BOLD\"/>"
+    "      <attribute name=\"foreground\" value=\"DarkSlateGray\"/>"
+    "      <attribute name=\"underline\" value=\"True\"/>"
+    "      <attribute name=\"size\" value=\"4\" start=\"5\" end=\"10\"/>"
+    "      <attribute name=\"font-desc\" value=\"Sans Italic 22\"/>"
+    "      <attribute name=\"language\" value=\"pt_BR\"/>"
+    "    </attributes>"
+    "  </object>"
+    "</interface>";
+  const gchar err_buffer1[] =
+    "<interface>"
+    "  <object class=\"GtkLabel\" id=\"label1\">"
+    "    <attributes>"
+    "      <attribute name=\"weight\"/>"
+    "    </attributes>"
+    "  </object>"
+    "</interface>";
+  const gchar err_buffer2[] =
+    "<interface>"
+    "  <object class=\"GtkLabel\" id=\"label1\">"
+    "    <attributes>"
+    "      <attribute name=\"weight\" value=\"PANGO_WEIGHT_BOLD\" unrecognized=\"True\"/>"
+    "    </attributes>"
+    "  </object>"
+    "</interface>";
+
+  GObject *label;
+  GError  *error = NULL;
+  PangoAttrList *attrs, *filtered;
+  
+  /* Test attributes are set */
+  builder = builder_new_from_string (buffer, -1, NULL);
+  label = gtk_builder_get_object (builder, "label1");
+  g_assert (label != NULL);
+
+  attrs = gtk_label_get_attributes (GTK_LABEL (label));
+  g_assert (attrs != NULL);
+
+  filtered = pango_attr_list_filter (attrs, filter_pango_attrs, &found);
+  g_assert (filtered);
+  pango_attr_list_unref (filtered);
+
+  g_assert (found.weight);
+  g_assert (found.foreground);
+  g_assert (found.underline);
+  g_assert (found.size);
+  g_assert (found.language);
+  g_assert (found.font_desc);
+
+  g_object_unref (builder);
+
+  /* Test errors are set */
+  builder = gtk_builder_new ();
+  gtk_builder_add_from_string (builder, err_buffer1, -1, &error);
+  label = gtk_builder_get_object (builder, "label1");
+  g_assert (error);
+  g_assert (error->domain == GTK_BUILDER_ERROR);
+  g_assert (error->code == GTK_BUILDER_ERROR_MISSING_ATTRIBUTE);
+  g_object_unref (builder);
+  g_error_free (error);
+  error = NULL;
+
+  builder = gtk_builder_new ();
+  gtk_builder_add_from_string (builder, err_buffer2, -1, &error);
+  label = gtk_builder_get_object (builder, "label1");
+
+  g_assert (error);
+  g_assert (error->domain == GTK_BUILDER_ERROR);
+  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_ATTRIBUTE);
+  g_object_unref (builder);
+  g_error_free (error);
+
+}
+
+
+static void
+test_requires (void)
+{
+  GtkBuilder *builder;
+  GError     *error = NULL;
+  gchar      *buffer;
+  const gchar buffer_fmt[] =
+    "<interface>"
+    "  <requires lib=\"gtk+\" version=\"%d.%d\"/>"
+    "</interface>";
+
+  buffer = g_strdup_printf (buffer_fmt, GTK_MAJOR_VERSION, GTK_MINOR_VERSION + 1);
+  builder = gtk_builder_new ();
+  gtk_builder_add_from_string (builder, buffer, -1, &error);
+  g_assert (error);
+  g_assert (error->domain == GTK_BUILDER_ERROR);
+  g_assert (error->code == GTK_BUILDER_ERROR_VERSION_MISMATCH);
+  g_object_unref (builder);
+  g_error_free (error);
+}
+
+
+static void 
+test_file (const gchar *filename)
+{
+  GtkBuilder *builder;
+  GError *error = NULL;
+  GSList *l, *objects;
+
+  builder = gtk_builder_new ();
+
+  if (!gtk_builder_add_from_file (builder, filename, &error))
+    {
+      g_error (error->message);
+      g_error_free (error);
+      return;
+    }
+
+  objects = gtk_builder_get_objects (builder);
+  for (l = objects; l; l = l->next)
+    {
+      GObject *obj = (GObject*)l->data;
+
+      if (GTK_IS_DIALOG (obj))
+       {
+         int response;
+
+         g_print ("Running dialog %s.\n",
+                  gtk_widget_get_name (GTK_WIDGET (obj)));
+         response = gtk_dialog_run (GTK_DIALOG (obj));
+       }
+      else if (GTK_IS_WINDOW (obj))
+       {
+         g_signal_connect (obj, "destroy", G_CALLBACK (gtk_main_quit), NULL);
+         g_print ("Showing %s.\n",
+                  gtk_widget_get_name (GTK_WIDGET (obj)));
+         gtk_widget_show_all (GTK_WIDGET (obj));
+       }
+    }
+
+  gtk_main ();
+
+  g_object_unref (builder);
+  builder = NULL;
+}
+
+int
+main (int argc, char **argv)
+{
+  /* initialize test program */
+  gtk_test_init (&argc, &argv);
+
+  if (argc > 1)
+    {
+      test_file (argv[1]);
+      return 0;
+    }
+
+  g_test_add_func ("/Builder/Parser", test_parser);
+  g_test_add_func ("/Builder/Types", test_types);
+  g_test_add_func ("/Builder/Construct-Only Properties", test_construct_only_property);
+  g_test_add_func ("/Builder/Children", test_children);
+  g_test_add_func ("/Builder/Child Properties", test_child_properties);
+  g_test_add_func ("/Builder/Object Properties", test_object_properties);
+  g_test_add_func ("/Builder/Notebook", test_notebook);
+  g_test_add_func ("/Builder/Domain", test_domain);
+  g_test_add_func ("/Builder/Signal Autoconnect", test_connect_signals);
+  g_test_add_func ("/Builder/UIManager Simple", test_uimanager_simple);
+  g_test_add_func ("/Builder/Spin Button", test_spin_button);
+  g_test_add_func ("/Builder/SizeGroup", test_sizegroup);
+  g_test_add_func ("/Builder/ListStore", test_list_store);
+  g_test_add_func ("/Builder/TreeStore", test_tree_store);
+  g_test_add_func ("/Builder/TreeView Column", test_treeview_column);
+  g_test_add_func ("/Builder/IconView", test_icon_view);
+  g_test_add_func ("/Builder/ComboBox", test_combo_box);
+  g_test_add_func ("/Builder/ComboBox Entry", test_combo_box_entry);
+  g_test_add_func ("/Builder/CellView", test_cell_view);
+  g_test_add_func ("/Builder/Dialog", test_dialog);
+  g_test_add_func ("/Builder/Accelerators", test_accelerators);
+  g_test_add_func ("/Builder/Widget", test_widget);
+  g_test_add_func ("/Builder/Value From String", test_value_from_string);
+  g_test_add_func ("/Builder/Reference Counting", test_reference_counting);
+  g_test_add_func ("/Builder/Window", test_window);
+  g_test_add_func ("/Builder/IconFactory", test_icon_factory);
+  g_test_add_func ("/Builder/PangoAttributes", test_pango_attributes);
+  g_test_add_func ("/Builder/Requires", test_requires);
+
+  return g_test_run();
+}
diff --git a/gtk/tests/defaultvalue.c b/gtk/tests/defaultvalue.c
new file mode 100644 (file)
index 0000000..c88926d
--- /dev/null
@@ -0,0 +1,341 @@
+/* Gtk+ default value tests
+ * Copyright (C) 2007 Christian Persch
+ *               2007 Johan Dahlin
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#undef GTK_DISABLE_DEPRECATED
+#define GTK_ENABLE_BROKEN
+#include <string.h>
+#include <gtk/gtk.h>
+#include <gtk/gtkunixprint.h>
+
+static void
+check_property (const char *output,
+               GParamSpec *pspec,
+               GValue *value)
+{
+  GValue default_value = { 0, };
+  char *v, *dv, *msg;
+
+  if (g_param_value_defaults (pspec, value))
+      return;
+
+  g_value_init (&default_value, G_PARAM_SPEC_VALUE_TYPE (pspec));
+  g_param_value_set_default (pspec, &default_value);
+      
+  v = g_strdup_value_contents (value);
+  dv = g_strdup_value_contents (&default_value);
+  
+  msg = g_strdup_printf ("%s %s.%s: %s != %s\n",
+                        output,
+                        g_type_name (pspec->owner_type),
+                        pspec->name,
+                        dv, v);
+  g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__,
+                      G_STRFUNC, msg);
+  g_free (msg);
+  
+  g_free (v);
+  g_free (dv);
+  g_value_unset (&default_value);
+}
+
+static void
+test_type (gconstpointer data)
+{
+  GObjectClass *klass;
+  GObject *instance;
+  GParamSpec **pspecs;
+  guint n_pspecs, i;
+  GType type;
+
+  type = * (GType *) data;
+
+  if (!G_TYPE_IS_CLASSED (type))
+    return;
+
+  if (G_TYPE_IS_ABSTRACT (type))
+    return;
+
+  if (!g_type_is_a (type, G_TYPE_OBJECT))
+    return;
+
+  /* These can't be freely constructed/destroyed */
+  if (g_type_is_a (type, GTK_TYPE_PRINT_JOB) ||
+      g_type_is_a (type, GDK_TYPE_PIXBUF_LOADER) ||
+      g_type_is_a (type, gdk_pixbuf_simple_anim_iter_get_type ()))
+    return;
+
+  /* The gtk_arg compat wrappers can't set up default values */
+  if (g_type_is_a (type, GTK_TYPE_CLIST) ||
+      g_type_is_a (type, GTK_TYPE_CTREE) ||
+      g_type_is_a (type, GTK_TYPE_LIST) ||
+      g_type_is_a (type, GTK_TYPE_TIPS_QUERY)) 
+    return;
+
+  klass = g_type_class_ref (type);
+  
+  if (g_type_is_a (type, GTK_TYPE_SETTINGS))
+    instance = g_object_ref (gtk_settings_get_default ());
+  else if (g_type_is_a (type, GDK_TYPE_PANGO_RENDERER))
+    instance = g_object_ref (gdk_pango_renderer_get_default (gdk_screen_get_default ()));
+  else if (g_type_is_a (type, GDK_TYPE_PIXMAP))
+    instance = g_object_ref (gdk_pixmap_new (NULL, 1, 1, 1));
+  else if (g_type_is_a (type, GDK_TYPE_COLORMAP))
+    instance = g_object_ref (gdk_colormap_new (gdk_visual_get_best (), TRUE));
+  else if (g_type_is_a (type, GDK_TYPE_WINDOW))
+    {
+      GdkWindowAttr attributes;
+      attributes.window_type = GDK_WINDOW_TEMP;
+      instance = g_object_ref (gdk_window_new (NULL, &attributes, 0));
+    }
+  else
+    instance = g_object_new (type, NULL);
+
+  if (g_type_is_a (type, G_TYPE_INITIALLY_UNOWNED))
+    g_object_ref_sink (instance);
+
+  pspecs = g_object_class_list_properties (klass, &n_pspecs);
+  for (i = 0; i < n_pspecs; ++i)
+    {
+      GParamSpec *pspec = pspecs[i];
+      GValue value = { 0, };
+      
+      if (pspec->owner_type != type)
+       continue;
+
+      if ((pspec->flags & G_PARAM_READABLE) == 0)
+       continue;
+
+      if (g_type_is_a (type, GDK_TYPE_DISPLAY_MANAGER) &&
+         (strcmp (pspec->name, "default-display") == 0))
+       continue;
+
+      if (g_type_is_a (type, GDK_TYPE_PANGO_RENDERER) &&
+         (strcmp (pspec->name, "screen") == 0))
+       continue;
+
+      if (g_type_is_a (type, GTK_TYPE_ABOUT_DIALOG) &&
+         (strcmp (pspec->name, "program-name") == 0))
+       continue;
+      
+      /* These are set to the current date */
+      if (g_type_is_a (type, GTK_TYPE_CALENDAR) &&
+         (strcmp (pspec->name, "year") == 0 ||
+          strcmp (pspec->name, "month") == 0 ||
+          strcmp (pspec->name, "day") == 0))
+       continue;
+
+      if (g_type_is_a (type, GTK_TYPE_CELL_RENDERER_TEXT) &&
+         (strcmp (pspec->name, "background-gdk") == 0 ||
+          strcmp (pspec->name, "foreground-gdk") == 0 ||
+          strcmp (pspec->name, "font") == 0 ||
+          strcmp (pspec->name, "font-desc") == 0))
+       continue;
+
+      if (g_type_is_a (type, GTK_TYPE_CELL_VIEW) &&
+         (strcmp (pspec->name, "background-gdk") == 0 ||
+          strcmp (pspec->name, "foreground-gdk") == 0))
+       continue;
+
+      if (g_type_is_a (type, GTK_TYPE_COLOR_BUTTON) &&
+         strcmp (pspec->name, "color") == 0)
+       continue;
+
+      if (g_type_is_a (type, GTK_TYPE_COLOR_SELECTION) &&
+         strcmp (pspec->name, "current-color") == 0)
+       continue;
+
+      /* Gets set to the cwd */
+      if (g_type_is_a (type, GTK_TYPE_FILE_SELECTION) &&
+         strcmp (pspec->name, "filename") == 0)
+       continue;
+
+      if (g_type_is_a (type, GTK_TYPE_FONT_SELECTION) &&
+         strcmp (pspec->name, "font") == 0)
+       continue;
+
+      if (g_type_is_a (type, GTK_TYPE_LAYOUT) &&
+         (strcmp (pspec->name, "hadjustment") == 0 ||
+           strcmp (pspec->name, "vadjustment") == 0))
+       continue;
+
+      if (g_type_is_a (type, GTK_TYPE_MESSAGE_DIALOG) &&
+         strcmp (pspec->name, "image") == 0)
+       continue;
+
+      if (g_type_is_a (type, GTK_TYPE_PRINT_OPERATION) &&
+         strcmp (pspec->name, "job-name") == 0)
+       continue;
+
+      if (g_type_is_a (type, GTK_TYPE_PRINT_UNIX_DIALOG) &&
+         (strcmp (pspec->name, "page-setup") == 0 ||
+          strcmp (pspec->name, "print-settings") == 0))
+       continue;
+
+      if (g_type_is_a (type, GTK_TYPE_PROGRESS_BAR) &&
+          strcmp (pspec->name, "adjustment") == 0)
+        continue;
+
+      /* filename value depends on $HOME */
+      if (g_type_is_a (type, GTK_TYPE_RECENT_MANAGER) &&
+          (strcmp (pspec->name, "filename") == 0 ||
+          strcmp (pspec->name, "size") == 0))
+        continue;
+
+      if (g_type_is_a (type, GTK_TYPE_SCALE_BUTTON) &&
+          strcmp (pspec->name, "adjustment") == 0)
+        continue;
+
+      if (g_type_is_a (type, GTK_TYPE_SCROLLED_WINDOW) &&
+         (strcmp (pspec->name, "hadjustment") == 0 ||
+           strcmp (pspec->name, "vadjustment") == 0))
+       continue;
+
+      /* these defaults come from XResources */
+      if (g_type_is_a (type, GTK_TYPE_SETTINGS) &&
+          strncmp (pspec->name, "gtk-xft-", 8) == 0)
+        continue;
+
+      if (g_type_is_a (type, GTK_TYPE_SETTINGS) &&
+          (strcmp (pspec->name, "color-hash") == 0 ||
+          strcmp (pspec->name, "gtk-cursor-theme-name") == 0 ||
+          strcmp (pspec->name, "gtk-cursor-theme-size") == 0 ||
+          strcmp (pspec->name, "gtk-double-click-time") == 0 ||
+          strcmp (pspec->name, "gtk-file-chooser-backend") == 0 ||
+          strcmp (pspec->name, "gtk-icon-theme-name") == 0 ||
+          strcmp (pspec->name, "gtk-fallback-icon-theme") == 0 ||
+          strcmp (pspec->name, "gtk-key-theme-name") == 0 ||
+          strcmp (pspec->name, "gtk-theme-name") == 0))
+        continue;
+
+      if (g_type_is_a (type, GTK_TYPE_SPIN_BUTTON) &&
+          (strcmp (pspec->name, "adjustment") == 0))
+        continue;
+
+      if (g_type_is_a (type, GTK_TYPE_STATUS_ICON) &&
+          (strcmp (pspec->name, "size") == 0 ||
+           strcmp (pspec->name, "screen") == 0))
+        continue;
+
+      if (g_type_is_a (type, GTK_TYPE_TEXT_BUFFER) &&
+          (strcmp (pspec->name, "tag-table") == 0 ||
+           strcmp (pspec->name, "copy-target-list") == 0 ||
+           strcmp (pspec->name, "paste-target-list") == 0))
+        continue;
+
+      /* language depends on the current locale */
+      if (g_type_is_a (type, GTK_TYPE_TEXT_TAG) &&
+          (strcmp (pspec->name, "background-gdk") == 0 ||
+           strcmp (pspec->name, "foreground-gdk") == 0 ||
+          strcmp (pspec->name, "language") == 0 ||
+          strcmp (pspec->name, "font") == 0 ||
+          strcmp (pspec->name, "font-desc") == 0))
+        continue;
+
+      if (g_type_is_a (type, GTK_TYPE_TEXT) &&
+         (strcmp (pspec->name, "hadjustment") == 0 ||
+           strcmp (pspec->name, "vadjustment") == 0))
+        continue;
+
+      if (g_type_is_a (type, GTK_TYPE_TEXT_VIEW) &&
+          strcmp (pspec->name, "buffer") == 0)
+        continue;
+
+      if (g_type_is_a (type, GTK_TYPE_TREE_VIEW) &&
+         (strcmp (pspec->name, "hadjustment") == 0 ||
+           strcmp (pspec->name, "vadjustment") == 0))
+       continue;
+
+      if (g_type_is_a (type, GTK_TYPE_VIEWPORT) &&
+         (strcmp (pspec->name, "hadjustment") == 0 ||
+           strcmp (pspec->name, "vadjustment") == 0))
+       continue;
+
+      if (g_type_is_a (type, GTK_TYPE_WIDGET) &&
+         (strcmp (pspec->name, "name") == 0 ||
+          strcmp (pspec->name, "screen") == 0 ||
+          strcmp (pspec->name, "style") == 0))
+       continue;
+
+      g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec));
+      g_object_get_property (instance, pspec->name, &value);
+      check_property ("Property", pspec, &value);
+      g_value_unset (&value);
+    }
+  g_free (pspecs);
+
+  if (g_type_is_a (type, GTK_TYPE_WIDGET))
+    {
+      pspecs = gtk_widget_class_list_style_properties (GTK_WIDGET_CLASS (klass), &n_pspecs);
+      
+      for (i = 0; i < n_pspecs; ++i)
+       {
+         GParamSpec *pspec = pspecs[i];
+         GValue value = { 0, };
+         
+         if (pspec->owner_type != type)
+           continue;
+
+         if ((pspec->flags & G_PARAM_READABLE) == 0)
+           continue;
+         
+         g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec));
+         gtk_widget_style_get_property (GTK_WIDGET (instance), pspec->name, &value);
+         check_property ("Style property", pspec, &value);
+         g_value_unset (&value);
+       }
+
+      g_free (pspecs);
+    }
+  
+  if (g_type_is_a (type, GDK_TYPE_WINDOW))
+    gdk_window_destroy (GDK_WINDOW (instance));
+  else
+    g_object_unref (instance);
+  
+  g_type_class_unref (klass);
+}
+
+extern void pixbuf_init (void);
+
+int
+main (int argc, char **argv)
+{
+  const GType *otypes;
+  guint i;
+
+  gtk_test_init (&argc, &argv);
+  pixbuf_init ();
+  gtk_test_register_all_types();
+  
+  otypes = gtk_test_list_all_types (NULL);
+  for (i = 0; otypes[i]; i++)
+    {
+      gchar *testname;
+      
+      testname = g_strdup_printf ("/Default Values/%s",
+                                 g_type_name (otypes[i]));
+      g_test_add_data_func (testname,
+                            &otypes[i],
+                           test_type);
+      g_free (testname);
+    }
+  
+  return g_test_run();
+}
diff --git a/gtk/tests/filechooser.c b/gtk/tests/filechooser.c
new file mode 100644 (file)
index 0000000..737e5fe
--- /dev/null
@@ -0,0 +1,1093 @@
+/* GTK - The GIMP Toolkit
+ * autotestfilechooser.c: Automated unit tests for the GtkFileChooser widget
+ * Copyright (C) 2005, Novell, Inc.
+ *
+ * Authors:
+ *   Federico Mena-Quintero <federico@novell.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/* TODO:
+ *
+ * - In test_reload_sequence(), test that the selection is preserved properly
+ *   between unmap/map.
+ *
+ * - More tests!
+ */
+
+#define GTK_FILE_SYSTEM_ENABLE_UNSUPPORTED
+#undef GTK_DISABLE_DEPRECATED
+#define SLEEP_DURATION  100
+
+#include <config.h>
+#include <string.h>
+#include <glib/gprintf.h>
+#include <gtk/gtk.h>
+#include "gtk/gtkfilechooserprivate.h"
+#include "gtk/gtkfilechooserdefault.h"
+#include "gtk/gtkfilechooserentry.h"
+
+static void
+log_test (gboolean passed, const char *test_name, ...)
+{
+  va_list args;
+  char *str;
+
+  va_start (args, test_name);
+  str = g_strdup_vprintf (test_name, args);
+  va_end (args);
+
+  if (g_test_verbose())
+    g_printf ("%s: %s\n", passed ? "PASSED" : "FAILED", str);
+  g_free (str);
+}
+
+typedef void (* SetFilenameFn) (GtkFileChooser *chooser, gpointer data);
+typedef gboolean (* CompareFilenameFn) (GtkFileChooser *chooser, gpointer data);
+
+struct test_set_filename_closure {
+  GtkWidget *chooser;
+  GtkWidget *accept_button;
+  gboolean focus_button;
+};
+
+static gboolean
+set_filename_timeout_cb (gpointer data)
+{
+  struct test_set_filename_closure *closure;
+
+  closure = data;
+
+  if (closure->focus_button)
+    gtk_widget_grab_focus (closure->accept_button);
+
+  gtk_button_clicked (GTK_BUTTON (closure->accept_button));
+
+  return FALSE;
+}
+
+
+static guint wait_for_idle_id = 0;
+
+static gboolean
+wait_for_idle_idle (gpointer data)
+{
+  wait_for_idle_id = 0;
+
+  return FALSE;
+}
+
+static void
+wait_for_idle (void)
+{
+  wait_for_idle_id = g_idle_add_full (G_PRIORITY_LOW + 100,
+                                     wait_for_idle_idle,
+                                     NULL, NULL);
+
+  while (wait_for_idle_id)
+    gtk_main_iteration ();
+}
+
+static gboolean
+test_set_filename (GtkFileChooserAction action,
+                  gboolean focus_button,
+                  SetFilenameFn set_filename_fn,const
+                  CompareFilenameFn compare_filename_fn,
+                  gpointer data)
+{
+  GtkWidget *chooser;
+  struct test_set_filename_closure closure;
+  gboolean retval;
+
+  chooser = gtk_file_chooser_dialog_new ("hello", NULL, action,
+                                        GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                        NULL);
+
+  closure.chooser = chooser;
+  closure.accept_button = gtk_dialog_add_button (GTK_DIALOG (chooser), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT);
+  closure.focus_button = focus_button;
+
+  gtk_dialog_set_default_response (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT);
+
+  (* set_filename_fn) (GTK_FILE_CHOOSER (chooser), data);
+
+  gdk_threads_add_timeout_full (G_MAXINT, SLEEP_DURATION, set_filename_timeout_cb, &closure, NULL);
+  gtk_dialog_run (GTK_DIALOG (chooser));
+
+  retval = (* compare_filename_fn) (GTK_FILE_CHOOSER (chooser), data);
+
+  gtk_widget_destroy (chooser);
+
+  return retval;
+}
+
+static void
+set_filename_cb (GtkFileChooser *chooser, gpointer data)
+{
+  const char *filename;
+
+  filename = data;
+  gtk_file_chooser_set_filename (chooser, filename);
+}
+
+static gboolean
+compare_filename_cb (GtkFileChooser *chooser, gpointer data)
+{
+  const char *filename;
+  char *out_filename;
+  gboolean retval;
+
+  filename = data;
+  out_filename = gtk_file_chooser_get_filename (chooser);
+
+  if (out_filename)
+    {
+      retval = (strcmp (out_filename, filename) == 0);
+      g_free (out_filename);
+    } else
+      retval = FALSE;
+
+  return retval;
+}
+
+static gboolean
+test_black_box_set_filename (GtkFileChooserAction action, const char *filename, gboolean focus_button)
+{
+  gboolean passed;
+
+  passed = test_set_filename (action, focus_button, set_filename_cb, compare_filename_cb, (char *) filename);
+
+  log_test (passed, "set_filename: action %d, focus_button=%s",
+           (int) action,
+           focus_button ? "TRUE" : "FALSE");
+
+  return passed;
+
+}
+
+struct current_name_closure {
+       const char *path;
+       const char *current_name;
+};
+
+static void
+set_current_name_cb (GtkFileChooser *chooser, gpointer data)
+{
+  struct current_name_closure *closure;
+
+  closure = data;
+
+  gtk_file_chooser_set_current_folder (chooser, closure->path);
+  gtk_file_chooser_set_current_name (chooser, closure->current_name);
+}
+
+static gboolean
+compare_current_name_cb (GtkFileChooser *chooser, gpointer data)
+{
+  struct current_name_closure *closure;
+  char *out_filename;
+  gboolean retval;
+
+  closure = data;
+
+  out_filename = gtk_file_chooser_get_filename (chooser);
+
+  if (out_filename)
+    {
+      char *filename;
+
+      filename = g_build_filename (closure->path, closure->current_name, NULL);
+      retval = (strcmp (filename, out_filename) == 0);
+      g_free (filename);
+      g_free (out_filename);
+    } else
+      retval = FALSE;
+
+  return retval;
+}
+
+static gboolean
+test_black_box_set_current_name (GtkFileChooserAction action, const char *path, const char *current_name, gboolean focus_button)
+{
+  struct current_name_closure closure;
+  gboolean passed;
+
+  closure.path = path;
+  closure.current_name = current_name;
+
+  passed = test_set_filename (action, focus_button,
+                             set_current_name_cb, compare_current_name_cb, &closure);
+
+  log_test (passed, "set_current_name, focus_button=%s", focus_button ? "TRUE" : "FALSE");
+
+  return passed;
+}
+
+/* FIXME: fails in CREATE_FOLDER mode when FOLDER_NAME == "/" */
+
+#if 0
+#define FILE_NAME "/nonexistent"
+#define FOLDER_NAME "/etc"
+#else
+#define FILE_NAME "/etc/passwd"
+#define FOLDER_NAME "/etc"
+#endif
+
+#define CURRENT_NAME "parangaricutirimicuaro.txt"
+#define CURRENT_NAME_FOLDER "parangaricutirimicuaro"
+
+/* https://bugzilla.novell.com/show_bug.cgi?id=184875
+ * http://bugzilla.gnome.org/show_bug.cgi?id=347066
+ * http://bugzilla.gnome.org/show_bug.cgi?id=346058
+ */
+static void
+test_black_box (void)
+{
+  gboolean passed;
+  char *cwd;
+
+  passed = TRUE;
+
+  passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_OPEN, FILE_NAME, FALSE);
+  g_assert (passed);
+  passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_OPEN, FILE_NAME, TRUE);
+  g_assert (passed);
+  passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SAVE, FILE_NAME, FALSE);
+  g_assert (passed);
+  passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SAVE, FILE_NAME, TRUE);
+  g_assert (passed);
+  passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, FOLDER_NAME, FALSE);
+  g_assert (passed);
+  passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, FOLDER_NAME, TRUE);
+  g_assert (passed);
+  passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, FOLDER_NAME, FALSE);
+  g_assert (passed);
+  passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, FOLDER_NAME, TRUE);
+  g_assert (passed);
+
+  cwd = g_get_current_dir ();
+
+  passed = passed && test_black_box_set_current_name (GTK_FILE_CHOOSER_ACTION_SAVE, cwd, CURRENT_NAME, FALSE);
+  g_assert (passed);
+  passed = passed && test_black_box_set_current_name (GTK_FILE_CHOOSER_ACTION_SAVE, cwd, CURRENT_NAME, TRUE);
+  g_assert (passed);
+  passed = passed && test_black_box_set_current_name (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, cwd, CURRENT_NAME_FOLDER, FALSE);
+  g_assert (passed);
+  passed = passed && test_black_box_set_current_name (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, cwd, CURRENT_NAME_FOLDER, TRUE);
+  g_assert (passed);
+
+  g_free (cwd);
+
+  log_test (passed, "Black box tests");
+}
+
+struct confirm_overwrite_closure {
+  GtkWidget *chooser;
+  GtkWidget *accept_button;
+  gint confirm_overwrite_signal_emitted;
+  gchar *extension;
+};
+
+static GtkFileChooserConfirmation
+confirm_overwrite_cb (GtkFileChooser *chooser, gpointer data)
+{
+  struct confirm_overwrite_closure *closure = data;
+
+  if (g_test_verbose())
+    printf ("bling!\n");
+  closure->confirm_overwrite_signal_emitted += 1;
+
+  return GTK_FILE_CHOOSER_CONFIRMATION_ACCEPT_FILENAME;
+}
+
+static void
+overwrite_response_cb (GtkFileChooser *chooser, gint response, gpointer data)
+{
+  struct confirm_overwrite_closure *closure = data;
+  char *filename;
+
+  if (g_test_verbose())
+    printf ("plong!\n");
+
+  if (response != GTK_RESPONSE_ACCEPT)
+    return;
+
+  filename = gtk_file_chooser_get_filename (chooser);
+
+  if (!g_str_has_suffix (filename, closure->extension))
+    {
+      char *basename;
+
+      basename = g_path_get_basename (filename);
+      g_free (filename);
+
+      filename = g_strconcat (basename, closure->extension, NULL);
+      gtk_file_chooser_set_current_name (chooser, filename);
+
+      g_signal_stop_emission_by_name (chooser, "response");
+      gtk_dialog_response (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT);
+    }
+}
+
+static gboolean
+confirm_overwrite_timeout_cb (gpointer data)
+{
+  struct confirm_overwrite_closure *closure;
+
+  closure = data;
+  gtk_button_clicked (GTK_BUTTON (closure->accept_button));
+
+  return FALSE;
+}
+
+/* http://bugzilla.gnome.org/show_bug.cgi?id=347883 */
+static gboolean
+test_confirm_overwrite_for_path (const char *path, gboolean append_extension)
+{
+  gboolean passed;
+  struct confirm_overwrite_closure closure;
+  char *filename;
+
+  passed = TRUE;
+
+  closure.extension = NULL;
+  closure.confirm_overwrite_signal_emitted = 0;
+  closure.chooser = gtk_file_chooser_dialog_new ("hello", NULL, GTK_FILE_CHOOSER_ACTION_SAVE,
+                                                GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                                NULL);
+  closure.accept_button = gtk_dialog_add_button (GTK_DIALOG (closure.chooser),
+                                                 GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT);
+  gtk_dialog_set_default_response (GTK_DIALOG (closure.chooser), GTK_RESPONSE_ACCEPT);
+
+  gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (closure.chooser), TRUE);
+
+  g_signal_connect (closure.chooser, "confirm-overwrite",
+                   G_CALLBACK (confirm_overwrite_cb), &closure);
+
+  if (append_extension)
+    {
+      char *extension;
+
+      filename = g_path_get_dirname (path);
+      gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (closure.chooser), filename);
+      g_free (filename);
+
+      filename = g_path_get_basename (path);
+      extension = strchr (filename, '.');
+
+      if (extension)
+        {
+          closure.extension = g_strdup (extension);
+          *extension = '\0';
+        }
+
+      gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (closure.chooser), filename);
+      g_free (filename);
+
+      g_signal_connect (closure.chooser, "response",
+                        G_CALLBACK (overwrite_response_cb), &closure);
+    }
+  else
+    {
+      gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (closure.chooser), path);
+    }
+
+  gdk_threads_add_timeout_full (G_MAXINT, SLEEP_DURATION, confirm_overwrite_timeout_cb, &closure, NULL);
+  gtk_dialog_run (GTK_DIALOG (closure.chooser));
+
+  filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (closure.chooser));
+  passed = passed && filename && (strcmp (filename, path) == 0);
+  g_free (filename);
+  
+  gtk_widget_destroy (closure.chooser);
+
+  passed = passed && (1 == closure.confirm_overwrite_signal_emitted);
+
+  log_test (passed, "Confirm overwrite for %s", path);
+
+  return passed;
+}
+
+static void
+test_confirm_overwrite (void)
+{
+  gboolean passed = TRUE;
+
+  /* first test for a file we know will always exist */
+  passed = passed && test_confirm_overwrite_for_path ("/etc/passwd", FALSE); 
+  g_assert (passed);
+  passed = passed && test_confirm_overwrite_for_path ("/etc/resolv.conf", TRUE); 
+  g_assert (passed);
+}
+
+static const GtkFileChooserAction open_actions[] = {
+  GTK_FILE_CHOOSER_ACTION_OPEN,
+  GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
+};
+
+static const GtkFileChooserAction save_actions[] = {
+  GTK_FILE_CHOOSER_ACTION_SAVE,
+  GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER
+};
+
+
+static gboolean
+has_action (const GtkFileChooserAction *actions,
+           int n_actions,
+           GtkFileChooserAction sought_action)
+{
+  int i;
+
+  for (i = 0; i < n_actions; i++)
+    if (actions[i] == sought_action)
+      return TRUE;
+
+  return FALSE;
+}
+
+static const char *
+get_action_name (GtkFileChooserAction action)
+{
+  GEnumClass *enum_class;
+  GEnumValue *enum_value;
+
+  enum_class = g_type_class_peek (GTK_TYPE_FILE_CHOOSER_ACTION);
+  if (!enum_class)
+    g_error ("BUG: get_action_name(): no GEnumClass for GTK_TYPE_FILE_CHOOSER_ACTION");
+
+  enum_value = g_enum_get_value (enum_class, (int) action);
+  if (!enum_value)
+    g_error ("BUG: get_action_name(): no GEnumValue for GtkFileChooserAction %d", (int) action);
+
+  return enum_value->value_name;
+}
+
+static GtkFileChooserDefault *
+get_impl_from_dialog (GtkWidget *dialog)
+{
+  GtkFileChooserDialog *d;
+  GtkFileChooserDialogPrivate *dialog_priv;
+  GtkFileChooserWidget *chooser_widget;
+  GtkFileChooserWidgetPrivate *widget_priv;
+  GtkFileChooserDefault *impl;
+
+  d = GTK_FILE_CHOOSER_DIALOG (dialog);
+  dialog_priv = d->priv;
+  chooser_widget = GTK_FILE_CHOOSER_WIDGET (dialog_priv->widget);
+  if (!chooser_widget)
+    g_error ("BUG: dialog_priv->widget is not a GtkFileChooserWidget");
+
+  widget_priv = chooser_widget->priv;
+  impl = (GtkFileChooserDefault *) (widget_priv->impl);
+  if (!impl)
+    g_error ("BUG: widget_priv->impl is not a GtkFileChooserDefault");
+
+  return impl;
+}
+
+static gboolean
+test_widgets_for_current_action (GtkFileChooserDialog *dialog,
+                                GtkFileChooserAction  expected_action)
+{
+  GtkFileChooserDefault *impl;
+  gboolean passed;
+
+  if (gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog)) != expected_action)
+    return FALSE;
+
+  impl = get_impl_from_dialog (GTK_WIDGET (dialog));
+
+  g_assert (impl->action == expected_action);
+
+  passed = TRUE;
+
+  /* OPEN implies that the "new folder" button is hidden; otherwise it is shown */
+  if (impl->action == GTK_FILE_CHOOSER_ACTION_OPEN)
+    passed = passed && !GTK_WIDGET_VISIBLE (impl->browse_new_folder_button);
+  else
+    passed = passed && GTK_WIDGET_VISIBLE (impl->browse_new_folder_button);
+
+  /* Check that the widgets are present/visible or not */
+  if (has_action (open_actions, G_N_ELEMENTS (open_actions), impl->action))
+    {
+      passed = passed && (impl->save_widgets == NULL
+                         && (impl->location_mode == LOCATION_MODE_PATH_BAR
+                             ? impl->location_entry == NULL
+                             : impl->location_entry != NULL)
+                         && impl->save_folder_label == NULL
+                         && impl->save_folder_combo == NULL
+                         && impl->save_expander == NULL
+                         && GTK_IS_CONTAINER (impl->browse_widgets) && GTK_WIDGET_DRAWABLE (impl->browse_widgets));
+    }
+  else if (has_action (save_actions, G_N_ELEMENTS (save_actions), impl->action))
+    {
+      /* FIXME: we can't use GTK_IS_FILE_CHOOSER_ENTRY() because it uses
+       * _gtk_file_chooser_entry_get_type(), which is a non-exported symbol.
+       * So, we just test impl->location_entry for being non-NULL
+       */
+      passed = passed && (GTK_IS_CONTAINER (impl->save_widgets) && GTK_WIDGET_DRAWABLE (impl->save_widgets)
+                         && impl->location_entry != NULL && GTK_WIDGET_DRAWABLE (impl->location_entry)
+                         && GTK_IS_LABEL (impl->save_folder_label) && GTK_WIDGET_DRAWABLE (impl->save_folder_label)
+                         && GTK_IS_COMBO_BOX (impl->save_folder_combo) && GTK_WIDGET_DRAWABLE (impl->save_folder_combo)
+                         && GTK_IS_EXPANDER (impl->save_expander) && GTK_WIDGET_DRAWABLE (impl->save_expander)
+                         && GTK_IS_CONTAINER (impl->browse_widgets));
+
+      /* FIXME: we are in a SAVE mode; test the visibility and sensitivity of
+       * the children that change depending on the state of the expander.
+       */
+    }
+  else
+    {
+      g_error ("BAD TEST: test_widgets_for_current_action() doesn't know about %s", get_action_name (impl->action));
+      passed = FALSE;
+    }
+
+  return passed;
+}
+
+typedef gboolean (* ForeachActionCallback) (GtkFileChooserDialog *dialog,
+                                           GtkFileChooserAction  action,
+                                           gpointer              user_data);
+
+static gboolean
+foreach_action (GtkFileChooserDialog *dialog,
+               ForeachActionCallback callback,
+               gpointer              user_data)
+{
+  GEnumClass *enum_class;
+  int i;
+
+  enum_class = g_type_class_peek (GTK_TYPE_FILE_CHOOSER_ACTION);
+  if (!enum_class)
+    g_error ("BUG: get_action_name(): no GEnumClass for GTK_TYPE_FILE_CHOOSER_ACTION");
+
+  for (i = 0; i < enum_class->n_values; i++)
+    {
+      GEnumValue *enum_value;
+      GtkFileChooserAction action;
+      gboolean passed;
+
+      enum_value = enum_class->values + i;
+      action = enum_value->value;
+
+      passed = (* callback) (dialog, action, user_data);
+      if (!passed)
+       return FALSE;
+    }
+
+  return TRUE;
+}
+
+struct action_closure {
+  GtkFileChooserAction from_action;
+};
+
+static gboolean
+switch_from_to_action_cb (GtkFileChooserDialog *dialog,
+                         GtkFileChooserAction  action,
+                         gpointer              user_data)
+{
+  struct action_closure *closure;
+  gboolean passed;
+
+  closure = user_data;
+
+  gtk_file_chooser_set_action (GTK_FILE_CHOOSER (dialog), closure->from_action);
+
+  passed = test_widgets_for_current_action (dialog, closure->from_action);
+  log_test (passed, "switch_from_to_action_cb(): reset to action %s", get_action_name (closure->from_action));
+  if (!passed)
+    return FALSE;
+
+  gtk_file_chooser_set_action (GTK_FILE_CHOOSER (dialog), action);
+
+  passed = test_widgets_for_current_action (dialog, action);
+  log_test (passed, "switch_from_to_action_cb(): transition from %s to %s",
+           get_action_name (closure->from_action),
+           get_action_name (action));
+  return passed;
+}
+
+static gboolean
+switch_from_action_cb (GtkFileChooserDialog *dialog,
+                      GtkFileChooserAction  action,
+                      gpointer              user_data)
+{
+  struct action_closure closure;
+
+  closure.from_action = action;
+
+  return foreach_action (dialog, switch_from_to_action_cb, &closure);
+}
+
+static void
+test_action_widgets (void)
+{
+  GtkWidget *dialog;
+  GtkFileChooserAction action;
+  gboolean passed;
+
+  dialog = gtk_file_chooser_dialog_new ("Test file chooser",
+                                       NULL,
+                                       GTK_FILE_CHOOSER_ACTION_OPEN,
+                                       GTK_STOCK_CANCEL,
+                                       GTK_RESPONSE_CANCEL,
+                                       GTK_STOCK_OK,
+                                       GTK_RESPONSE_ACCEPT,
+                                       NULL);
+  gtk_widget_show_now (dialog);
+
+  action = gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog));
+
+  passed = test_widgets_for_current_action (GTK_FILE_CHOOSER_DIALOG (dialog), action);
+  log_test (passed, "test_action_widgets(): widgets for initial action %s", get_action_name (action));
+  g_assert (passed);
+
+  passed = foreach_action (GTK_FILE_CHOOSER_DIALOG (dialog), switch_from_action_cb, NULL);
+  log_test (passed, "test_action_widgets(): all transitions through property change");
+  g_assert (passed);
+
+  gtk_widget_destroy (dialog);
+}
+
+static gboolean
+test_reload_sequence (gboolean set_folder_before_map)
+{
+  GtkWidget *dialog;
+  GtkFileChooserDefault *impl;
+  gboolean passed;
+  char *folder;
+  char *current_working_dir;
+
+  passed = TRUE;
+
+  current_working_dir = g_get_current_dir ();
+
+  dialog = gtk_file_chooser_dialog_new ("Test file chooser",
+                                       NULL,
+                                       GTK_FILE_CHOOSER_ACTION_OPEN,
+                                       GTK_STOCK_CANCEL,
+                                       GTK_RESPONSE_CANCEL,
+                                       GTK_STOCK_OK,
+                                       GTK_RESPONSE_ACCEPT,
+                                       NULL);
+  impl = get_impl_from_dialog (dialog);
+
+  if (set_folder_before_map)
+    {
+      gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), g_get_home_dir ());
+
+      wait_for_idle ();
+
+      passed = passed && (impl->current_folder != NULL
+                         && impl->browse_files_model != NULL
+                         && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
+                         && impl->reload_state == RELOAD_HAS_FOLDER
+                         && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
+                         && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
+                             ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
+                             : TRUE));
+
+      wait_for_idle ();
+
+      folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
+      passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
+      g_free (folder);
+    }
+  else
+    {
+      /* Initially, no folder is not loaded or pending */
+      passed = passed && (impl->current_folder == NULL
+                         && impl->sort_model == NULL
+                         && impl->browse_files_model == NULL
+                         && impl->load_state == LOAD_EMPTY
+                         && impl->reload_state == RELOAD_EMPTY
+                         && impl->load_timeout_id == 0);
+
+      wait_for_idle ();
+
+      folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
+      passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
+    }
+
+  log_test (passed, "test_reload_sequence(): initial status");
+
+  /* After mapping, it is loading some folder, either the one that was explicitly set or the default one */
+
+  gtk_widget_show_now (dialog);
+
+  wait_for_idle ();
+
+  passed = passed && (impl->current_folder != NULL
+                     && impl->browse_files_model != NULL
+                     && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
+                     && impl->reload_state == RELOAD_HAS_FOLDER
+                     && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
+                     && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
+                         ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
+                         : TRUE));
+
+  folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
+  if (set_folder_before_map)
+    passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
+  else
+    passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
+
+  g_free (folder);
+
+  log_test (passed, "test_reload_sequence(): status after map");
+
+  /* Unmap it; we should still have a folder */
+
+  gtk_widget_hide (dialog);
+
+  wait_for_idle ();
+
+  passed = passed && (impl->current_folder != NULL
+                     && impl->browse_files_model != NULL
+                     && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
+                     && impl->reload_state == RELOAD_WAS_UNMAPPED
+                     && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
+                     && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
+                         ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
+                         : TRUE));
+
+  folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
+  if (set_folder_before_map)
+    passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
+  else
+    passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
+
+  g_free (folder);
+
+  log_test (passed, "test_reload_sequence(): status after unmap");
+
+  /* Map it again! */
+
+  gtk_widget_show_now (dialog);
+
+  wait_for_idle ();
+
+  passed = passed && (impl->current_folder != NULL
+                     && impl->browse_files_model != NULL
+                     && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
+                     && impl->reload_state == RELOAD_HAS_FOLDER
+                     && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
+                     && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
+                         ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
+                         : TRUE));
+
+  folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
+  if (set_folder_before_map)
+    passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
+  else
+    passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
+
+  g_free (folder);
+
+  log_test (passed, "test_reload_sequence(): status after re-map");
+
+  gtk_widget_destroy (dialog);
+  g_free (current_working_dir);
+
+  return passed;
+}
+
+static void
+test_reload (void)
+{
+  gboolean passed;
+
+  passed = test_reload_sequence (FALSE);
+  log_test (passed, "test_reload(): create and use the default folder");
+  g_assert (passed);
+
+  passed = test_reload_sequence (TRUE);
+  log_test (passed, "test_reload(): set a folder explicitly before mapping");
+  g_assert (passed);
+}
+
+static gboolean
+test_button_folder_states_for_action (GtkFileChooserAction action, gboolean use_dialog, gboolean set_folder_on_dialog)
+{
+  gboolean passed;
+  GtkWidget *window;
+  GtkWidget *button;
+  char *folder;
+  GtkWidget *dialog;
+  char *current_working_dir;
+  gboolean must_have_cwd;
+
+  passed = TRUE;
+
+  current_working_dir = g_get_current_dir ();
+  must_have_cwd = !(use_dialog && set_folder_on_dialog);
+
+  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+  if (use_dialog)
+    {
+      dialog = gtk_file_chooser_dialog_new ("Test", NULL, action,
+                                           GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                           GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
+                                           NULL);
+      button = gtk_file_chooser_button_new_with_dialog (dialog);
+
+      if (set_folder_on_dialog)
+       gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), g_get_home_dir ());
+    }
+  else
+    {
+      button = gtk_file_chooser_button_new ("Test", action);
+      dialog = NULL; /* keep gcc happy */
+    }
+
+  gtk_container_add (GTK_CONTAINER (window), button);
+
+  /* Pre-map; no folder is set */
+  wait_for_idle ();
+
+  folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
+  if (must_have_cwd)
+    passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
+  else
+    passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
+
+  log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, pre-map, %s",
+           get_action_name (action),
+           use_dialog,
+           set_folder_on_dialog,
+           must_have_cwd ? "must have $cwd" : "must have explicit folder");
+
+  /* Map; folder should be set */
+
+  gtk_widget_show_all (window);
+  gtk_widget_show_now (window);
+
+  wait_for_idle ();
+
+  folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
+
+  if (must_have_cwd)
+    passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
+  else
+    passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
+
+  log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, mapped, %s",
+           get_action_name (action),
+           use_dialog,
+           set_folder_on_dialog,
+           must_have_cwd ? "must have $cwd" : "must have explicit folder");
+  g_free (folder);
+
+  /* Unmap; folder should be set */
+
+  gtk_widget_hide (window);
+  wait_for_idle ();
+  folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
+
+  if (must_have_cwd)
+    passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
+  else
+    passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
+
+  log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, unmapped, %s",
+           get_action_name (action),
+           use_dialog,
+           set_folder_on_dialog,
+           must_have_cwd ? "must have $cwd" : "must have explicit folder");
+  g_free (folder);
+
+  /* Re-map; folder should be set */
+
+  gtk_widget_show_now (window);
+  folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
+
+  if (must_have_cwd)
+    passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
+  else
+    passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
+  wait_for_idle ();
+  log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, re-mapped, %s",
+           get_action_name (action),
+           use_dialog,
+           set_folder_on_dialog,
+           must_have_cwd ? "must have $cwd" : "must have explicit folder");
+  g_free (folder);
+
+  g_free (current_working_dir);
+
+  gtk_widget_destroy (window);
+
+  return passed;
+}
+
+static void
+test_button_folder_states (void)
+{
+  /* GtkFileChooserButton only supports OPEN and SELECT_FOLDER */
+  static const GtkFileChooserAction actions_to_test[] = {
+    GTK_FILE_CHOOSER_ACTION_OPEN,
+    GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
+  };
+  gboolean passed;
+  int i;
+
+  passed = TRUE;
+
+  for (i = 0; i < G_N_ELEMENTS (actions_to_test); i++)
+    {
+      passed = passed && test_button_folder_states_for_action (actions_to_test[i], FALSE, FALSE);
+      g_assert (passed);
+      passed = passed && test_button_folder_states_for_action (actions_to_test[i], TRUE, FALSE);
+      g_assert (passed);
+      passed = passed && test_button_folder_states_for_action (actions_to_test[i], TRUE, TRUE);
+      g_assert (passed);
+      log_test (passed, "test_button_folder_states(): action %s", get_action_name (actions_to_test[i]));
+    }
+
+  log_test (passed, "test_button_folder_states(): all supported actions");
+}
+
+static gboolean
+sleep_timeout_cb (gpointer data)
+{
+  gtk_main_quit ();
+  return FALSE;
+}
+
+static void
+sleep_in_main_loop (double fraction)
+{
+  /* process all pending idles and events */
+  while (g_main_context_pending (NULL))
+    g_main_context_iteration (NULL, FALSE);
+  /* sleeping probably isn't strictly necessary here */
+  gdk_threads_add_timeout_full (G_MAXINT, fraction * SLEEP_DURATION, sleep_timeout_cb, NULL, NULL);
+  gtk_main ();
+  /* process any pending idles or events that arrived during sleep */
+  while (g_main_context_pending (NULL))
+    g_main_context_iteration (NULL, FALSE);
+}
+
+static void
+test_folder_switch_and_filters (void)
+{
+  gboolean passed;
+  char *cwd;
+  char *base_dir;
+  GtkFilePath *cwd_path;
+  GtkFilePath *base_dir_path;
+  GtkWidget *dialog;
+  GtkFileFilter *all_filter;
+  GtkFileFilter *txt_filter;
+  GtkFileChooserDefault *impl;
+
+  passed = TRUE;
+
+  cwd = g_get_current_dir ();
+  base_dir = g_build_filename (cwd, "file-chooser-test-dir", NULL);
+
+  dialog = gtk_file_chooser_dialog_new ("Test", NULL, GTK_FILE_CHOOSER_ACTION_OPEN,
+                                       GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                       GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
+                                       NULL);
+  impl = get_impl_from_dialog (dialog);
+
+  cwd_path = gtk_file_system_filename_to_path (impl->file_system, cwd);
+  base_dir_path = gtk_file_system_filename_to_path (impl->file_system, base_dir);
+
+  passed = passed && gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), base_dir);
+  g_assert (passed);
+
+  /* All files filter */
+
+  all_filter = gtk_file_filter_new ();
+  gtk_file_filter_set_name (all_filter, "All files");
+  gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), all_filter);
+
+  /* *.txt filter */
+
+  txt_filter = gtk_file_filter_new ();
+  gtk_file_filter_set_name (all_filter, "*.txt");
+  gtk_file_filter_add_pattern (txt_filter, "*.txt");
+  gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), txt_filter);
+
+  /* Test filter set */
+
+  gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), all_filter);
+  passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == all_filter);
+  g_assert (passed);
+
+  gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), txt_filter);
+  passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
+  log_test (passed, "test_folder_switch_and_filters(): set and get filter");
+  g_assert (passed);
+
+  gtk_widget_show (dialog);
+
+  /* Test that filter is unchanged when we switch folders */
+
+  gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), cwd);
+  sleep_in_main_loop (0.5);
+  passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
+  g_assert (passed);
+
+  gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), base_dir);
+  sleep_in_main_loop (0.25);
+
+  g_signal_emit_by_name (impl->browse_path_bar, "path-clicked",
+                        (GtkFilePath *) cwd_path,
+                        (GtkFilePath *) base_dir_path,
+                        FALSE);
+  sleep_in_main_loop (0.25);
+  passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
+  log_test (passed, "test_folder_switch_and_filters(): filter after changing folder");
+  g_assert (passed);
+
+  /* cleanups */
+  g_free (cwd);
+  g_free (base_dir);
+  gtk_file_path_free (cwd_path);
+  gtk_file_path_free (base_dir_path);
+
+  gtk_widget_destroy (dialog);
+
+  log_test (passed, "test_folder_switch_and_filters(): all filter tests");
+}
+
+extern void pixbuf_init (void);
+
+int
+main (int    argc,
+      char **argv)
+{
+  pixbuf_init ();
+  /* initialize test program */
+  gtk_test_init (&argc, &argv);
+
+  /* register tests */
+  g_test_add_func ("/GtkFileChooser/black_box", test_black_box);
+  g_test_add_func ("/GtkFileChooser/confirm_overwrite", test_confirm_overwrite);
+  g_test_add_func ("/GtkFileChooser/action_widgets", test_action_widgets);
+  g_test_add_func ("/GtkFileChooser/reload", test_reload);
+  g_test_add_func ("/GtkFileChooser/button_folder_states", test_button_folder_states);
+  g_test_add_func ("/GtkFileChooser/folder_switch_and_filters", test_folder_switch_and_filters);
+
+  /* run and check selected tests */
+  return g_test_run();
+}
diff --git a/gtk/tests/floating.c b/gtk/tests/floating.c
new file mode 100644 (file)
index 0000000..d0682cf
--- /dev/null
@@ -0,0 +1,71 @@
+/* floatingtest.c - test floating flag uses
+ * Copyright (C) 2005 Tim Janik
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#undef GTK_DISABLE_DEPRECATED
+#include "../gtk/gtk.h"
+
+static gboolean destroyed = FALSE;
+static void
+destroy (void)
+{
+  destroyed = TRUE;
+}
+
+static void
+floating_tests (void)
+{
+  GtkWidget *widget = g_object_new (GTK_TYPE_LABEL, NULL);
+  g_object_connect (widget, "signal::destroy", destroy, NULL, NULL);
+
+  g_assert (GTK_OBJECT_FLOATING (widget));
+  g_assert (g_object_is_floating (widget));
+
+  GTK_OBJECT_UNSET_FLAGS (widget, GTK_FLOATING);
+  g_assert (!GTK_OBJECT_FLOATING (widget));
+  g_assert (!g_object_is_floating (widget));
+
+  GTK_OBJECT_SET_FLAGS (widget, GTK_FLOATING);
+  g_assert (GTK_OBJECT_FLOATING (widget));
+  g_assert (g_object_is_floating (widget));
+
+  g_object_ref_sink (widget);
+  g_assert (!GTK_OBJECT_FLOATING (widget));
+  g_assert (!g_object_is_floating (widget));
+
+  g_object_force_floating (G_OBJECT (widget));
+  g_assert (GTK_OBJECT_FLOATING (widget));
+  g_assert (g_object_is_floating (widget));
+
+  g_object_ref (widget);
+  gtk_object_sink (GTK_OBJECT (widget));
+  g_assert (!GTK_OBJECT_FLOATING (widget));
+  g_assert (!g_object_is_floating (widget));
+
+  g_assert (!destroyed);
+  g_object_unref (widget);
+  g_assert (destroyed);
+}
+
+int
+main (int   argc,
+      char *argv[])
+{
+  gtk_test_init (&argc, &argv);
+  g_test_add_func ("/floatingtest", floating_tests);
+  return g_test_run();
+}
diff --git a/gtk/tests/object.c b/gtk/tests/object.c
new file mode 100644 (file)
index 0000000..c24ba9f
--- /dev/null
@@ -0,0 +1,358 @@
+/* Gtk+ object tests
+ * Copyright (C) 2007 Imendio AB
+ * Authors: Tim Janik
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#include <gtk/gtk.h>
+#include <string.h>
+
+/* --- helper macros for property value generation --- */
+/* dvalue=+0: generate minimum value
+ * dvalue=.x: generate value within value range proportional to x.
+ * dvalue=+1: generate maximum value
+ * dvalue=-1: generate random value within value range
+ * dvalue=+2: initialize value from default_value
+ */
+#define ASSIGN_VALUE(__g_value_set_func, __value, PSPECTYPE, __pspec, __default_value, __minimum, __maximum, __dvalue) do { \
+  PSPECTYPE __p = (PSPECTYPE) __pspec; \
+  __g_value_set_func (__value, SELECT_VALUE (__dvalue, __p->__default_value, __p->__minimum, __p->__maximum)); \
+} while (0)
+#define SELECT_VALUE(__dvalue, __default_value, __minimum, __maximum) ( \
+  __dvalue >= 0 && __dvalue <= 1 ? __minimum * (1 - __dvalue) + __dvalue * __maximum : \
+    __dvalue <= -1 ? g_test_rand_double_range (__minimum, __maximum) : \
+      __default_value)
+#define SELECT_NAME(__dvalue) ( \
+  __dvalue == 0 ? "minimum" : \
+    __dvalue == 1 ? "maximum" : \
+      __dvalue >= +2 ? "default" : \
+        __dvalue == 0.5 ? "medium" : \
+          __dvalue > 0 && __dvalue < 1 ? "fractional" : \
+            "random")
+#define MATCH_ANY_VALUE         ((void*) 0xf1874c23)
+
+/* --- property blacklists --- */
+typedef struct {
+  const char   *type_name;
+  const char   *name;
+  gconstpointer value;
+} IgnoreProperty;
+static const IgnoreProperty*
+list_ignore_properties (gboolean buglist)
+{
+  /* currently untestable properties */
+  static const IgnoreProperty ignore_properties[] = {
+    { "GtkContainer",           "child",                NULL, },                        /* needs working child widget */
+    { "GtkRadioMenuItem",       "group",                NULL, },                        /* needs working sibling */
+    { "GtkWidget",              "parent",               NULL, },                        /* needs working parent widget */
+    { "GtkCList",               "selection-mode",       (void*) GTK_SELECTION_NONE, },
+    { "GtkWidget",              "has-default",          (void*) TRUE, },                /* conflicts with toplevel-less widgets */
+    { "GtkWidget",              "screen",               NULL, },
+    { "GtkWindow",              "type-hint",            (void*) GDK_WINDOW_TYPE_HINT_DND, }, /* conflicts with ::visible=TRUE */
+    { "GtkCellView",            "background",           (void*) "", },                  /* "" is not a valid background color */
+    { "GtkColorButton",         "color",                (void*) NULL, },                /* not a valid boxed color */
+    { "GtkInputDialog",         "has-separator",        (void*) MATCH_ANY_VALUE, },     /* property disabled */
+    { "GtkMessageDialog",       "has-separator",        (void*) MATCH_ANY_VALUE, },     /* property disabled */
+    { "GtkFontSelectionDialog", "has-separator",        (void*) MATCH_ANY_VALUE, },     /* property disabled */
+    { "GtkColorSelectionDialog","has-separator",        (void*) MATCH_ANY_VALUE, },     /* property disabled */
+    { "GtkColorSelection",      "child",                NULL, },
+    { "GtkColorSelection",      "current-color",        (void*) NULL, },                /* not a valid boxed color */
+    { "GtkComboBox",            "row-span-column",      (void*) MATCH_ANY_VALUE },      /* GtkComboBoxEntry needs a tree model for this */
+    { "GtkComboBox",            "column-span-column",   (void*) MATCH_ANY_VALUE },      /* GtkComboBoxEntry needs a tree model for this */
+    { "GtkComboBoxEntry",       "text-column",          (void*) MATCH_ANY_VALUE },      /* GtkComboBoxEntry needs a tree model for this */
+    { "GtkFileChooserButton",   "select-multiple",      (void*) MATCH_ANY_VALUE },      /* property disabled */
+    { "GtkFileChooserButton",   "action",               (void*) GTK_FILE_CHOOSER_ACTION_SAVE },
+    { "GtkFileChooserButton",   "action",               (void*) GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER },
+    { "GtkFileChooserWidget",   "select-multiple",      (void*) 0x1 },                  /* property conflicts */
+    { "GtkFileChooserDialog",   "select-multiple",      (void*) MATCH_ANY_VALUE },      /* property disabled */
+    { "GtkRecentChooserMenu",   "select-multiple",      (void*) MATCH_ANY_VALUE },      /* property disabled */
+    { "GtkTextView",            "overwrite",            (void*) MATCH_ANY_VALUE },      /* needs text buffer */
+    { "GtkToolbar",             "icon-size",            (void*) GTK_ICON_SIZE_INVALID },
+    { NULL, NULL, NULL }
+  };
+  /* properties suspected to be Gdk/Gtk+ bugs */
+  static const IgnoreProperty bug_properties[] = {
+    { "GtkMessageDialog",       "image",                NULL, },                        /* FIXME: should accept NULL images */
+    { "GtkOptionMenu",          "menu",                 NULL, },                        /* FIXME: should accept NULL menus */
+    { "GtkComboBox",            "active",               (void*) MATCH_ANY_VALUE },      /* FIXME: triggers NULL model bug */
+    { "GtkComboBoxEntry",       "text-column",          (void*) 0xffffffff },           /* FIXME: triggers signedness bug */
+    { "GtkCTree",               "indent",               (void*) MATCH_ANY_VALUE },      /* FIXME: triggers signedness bug */
+    { "GtkCTree",               "spacing",              (void*) MATCH_ANY_VALUE },      /* FIXME: triggers signedness bug */
+    { "GtkCurve",               "curve-type",           (void*) MATCH_ANY_VALUE },      /* FIXME: triggers OOM */
+    { "GtkCurve",               "min-x",                (void*) 0x80000000 },           /* FIXME: triggers coordinate OOB */
+    { "GtkCurve",               "min-y",                (void*) 0x80000000 },           /* FIXME: triggers coordinate OOB */
+    { "GtkCurve",               "max-x",                (void*) 0x80000000 },           /* FIXME: triggers coordinate OOB */
+    { "GtkCurve",               "max-y",                (void*) 0x80000000 },           /* FIXME: triggers coordinate OOB */
+    { "GtkFileChooserButton",   "local-only",           (void*) MATCH_ANY_VALUE },      /* FIXME: triggers NULL path assertion */
+    { "GtkFileChooserDialog",   "local-only",           (void*) MATCH_ANY_VALUE },      /* FIXME: triggers NULL path assertion */
+    { "GtkFileChooserDialog",   "action",               (void*) MATCH_ANY_VALUE },      /* FIXME: triggers closure->ref_count assertion */
+    { "GtkFileChooserDialog",   "visible",              (void*) TRUE },                 /* FIXME: triggers gtk_window_resize assertion */
+    { "GtkFileChooserWidget",   "local-only",           (void*) MATCH_ANY_VALUE },      /* FIXME: triggers NULL path assertion */
+    { "GtkFontSelection",       "font-name",            (void*) MATCH_ANY_VALUE },      /* FIXME: requires non-NULL GdkScreen */
+    { "GtkInvisible",           "has-focus",            (void*) TRUE },                 /* FIXME: triggers invalid window cast */
+    { "GtkInvisible",           "is-focus",             (void*) TRUE },                 /* FIXME: triggers invalid window cast */
+    { "GtkMenu",                "tearoff-state",        (void*) MATCH_ANY_VALUE },      /* FIXME: triggers NULL widget cast */
+    { "GtkProgress",            "activity-mode",        (void*) TRUE },                 /* FIXME: segfaults */
+    { "GtkScaleButton",         "adjustment",           NULL, },                        /* FIXME: should accept NULL adjustments */
+    { "GtkStatusbar",           "sensitive",            (void*) FALSE },                /* FIXME: check if widget is realize */
+    { "GtkTable",               "n-rows",               (void*) MATCH_ANY_VALUE },      /* FIXME: fix property minimum/maximum */
+    { "GtkTable",               "n-columns",            (void*) MATCH_ANY_VALUE },      /* FIXME: fix property minimum/maximum */
+    { "GtkText",                "text-position",        (void*) MATCH_ANY_VALUE },      /* FIXME: segfaults, fix property minimum/maximum */
+    { NULL, NULL, NULL }
+  };
+  if (buglist)
+    return bug_properties;
+  else
+    return ignore_properties;
+}
+
+/* --- test functions --- */
+static void
+pspec_select_value (GParamSpec *pspec,
+                    GValue     *value,
+                    double      dvalue)
+{
+  /* generate a value suitable for pspec */
+  if (G_IS_PARAM_SPEC_CHAR (pspec))
+    ASSIGN_VALUE (g_value_set_char, value, GParamSpecChar*, pspec, default_value, minimum, maximum, dvalue);
+  else if (G_IS_PARAM_SPEC_UCHAR (pspec))
+    ASSIGN_VALUE (g_value_set_uchar, value, GParamSpecUChar*, pspec, default_value, minimum, maximum, dvalue);
+  else if (G_IS_PARAM_SPEC_INT (pspec))
+    ASSIGN_VALUE (g_value_set_int, value, GParamSpecInt*, pspec, default_value, minimum, maximum, dvalue);
+  else if (G_IS_PARAM_SPEC_UINT (pspec))
+    ASSIGN_VALUE (g_value_set_uint, value, GParamSpecUInt*, pspec, default_value, minimum, maximum, dvalue);
+  else if (G_IS_PARAM_SPEC_LONG (pspec))
+    ASSIGN_VALUE (g_value_set_long, value, GParamSpecLong*, pspec, default_value, minimum, maximum, dvalue);
+  else if (G_IS_PARAM_SPEC_ULONG (pspec))
+    ASSIGN_VALUE (g_value_set_ulong, value, GParamSpecULong*, pspec, default_value, minimum, maximum, dvalue);
+  else if (G_IS_PARAM_SPEC_INT64 (pspec))
+    ASSIGN_VALUE (g_value_set_int64, value, GParamSpecInt64*, pspec, default_value, minimum, maximum, dvalue);
+  else if (G_IS_PARAM_SPEC_UINT64 (pspec))
+    ASSIGN_VALUE (g_value_set_uint64, value, GParamSpecUInt64*, pspec, default_value, minimum, maximum, dvalue);
+  else if (G_IS_PARAM_SPEC_FLOAT (pspec))
+    ASSIGN_VALUE (g_value_set_float, value, GParamSpecFloat*, pspec, default_value, minimum, maximum, dvalue);
+  else if (G_IS_PARAM_SPEC_DOUBLE (pspec))
+    ASSIGN_VALUE (g_value_set_double, value, GParamSpecDouble*, pspec, default_value, minimum, maximum, dvalue);
+  else if (G_IS_PARAM_SPEC_BOOLEAN (pspec))
+    g_value_set_boolean (value, SELECT_VALUE (dvalue, ((GParamSpecBoolean*) pspec)->default_value, FALSE, TRUE));
+  else if (G_IS_PARAM_SPEC_UNICHAR (pspec))
+    g_value_set_uint (value, SELECT_VALUE (dvalue, ((GParamSpecUnichar*) pspec)->default_value, FALSE, TRUE));
+  else if (G_IS_PARAM_SPEC_GTYPE (pspec))
+    g_value_set_gtype (value, SELECT_VALUE ((int) dvalue, ((GParamSpecGType*) pspec)->is_a_type, 0, GTK_TYPE_WIDGET));
+  else if (G_IS_PARAM_SPEC_STRING (pspec))
+    {
+      GParamSpecString *sspec = (GParamSpecString*) pspec;
+      if (dvalue >= +2)
+        g_value_set_string (value, sspec->default_value);
+      if (dvalue > 0 && sspec->cset_first && sspec->cset_nth)
+        g_value_take_string (value, g_strdup_printf ("%c%c", sspec->cset_first[0], sspec->cset_nth[0]));
+      else /* if (sspec->ensure_non_null) */
+        g_value_set_string (value, "");
+    }
+  else if (G_IS_PARAM_SPEC_ENUM (pspec))
+    {
+      GParamSpecEnum *espec = (GParamSpecEnum*) pspec;
+      if (dvalue >= +2)
+        g_value_set_enum (value, espec->default_value);
+      if (dvalue >= 0 && dvalue <= 1)
+        g_value_set_enum (value, espec->enum_class->values[(int) ((espec->enum_class->n_values - 1) * dvalue)].value);
+      else if (dvalue <= -1)
+        g_value_set_enum (value, espec->enum_class->values[g_test_rand_int_range (0, espec->enum_class->n_values)].value);
+    }
+  else if (G_IS_PARAM_SPEC_FLAGS (pspec))
+    {
+      GParamSpecFlags *fspec = (GParamSpecFlags*) pspec;
+      if (dvalue >= +2)
+        g_value_set_flags (value, fspec->default_value);
+      if (dvalue >= 0 && dvalue <= 1)
+        g_value_set_flags (value, fspec->flags_class->values[(int) ((fspec->flags_class->n_values - 1) * dvalue)].value);
+      else if (dvalue <= -1)
+        g_value_set_flags (value, fspec->flags_class->values[g_test_rand_int_range (0, fspec->flags_class->n_values)].value);
+    }
+  /* unimplemented:
+   * G_IS_PARAM_SPEC_PARAM
+   * G_IS_PARAM_SPEC_BOXED
+   * G_IS_PARAM_SPEC_POINTER
+   * G_IS_PARAM_SPEC_VALUE_ARRAY
+   * G_IS_PARAM_SPEC_OBJECT
+   */
+}
+
+static gpointer
+value_as_pointer (GValue *value)
+{
+  if (g_value_fits_pointer (value))
+    return g_value_peek_pointer (value);
+  if (G_VALUE_HOLDS_BOOLEAN (value))
+    return (void*) g_value_get_boolean (value);
+  if (G_VALUE_HOLDS_CHAR (value))
+    return (void*) (gssize) g_value_get_char (value);
+  if (G_VALUE_HOLDS_UCHAR (value))
+    return (void*) (gsize) g_value_get_uchar (value);
+  if (G_VALUE_HOLDS_INT (value))
+    return (void*) g_value_get_int (value);
+  if (G_VALUE_HOLDS_UINT (value))
+    return (void*) g_value_get_uint (value);
+  if (G_VALUE_HOLDS_LONG (value))
+    return (void*) g_value_get_long (value);
+  if (G_VALUE_HOLDS_ULONG (value))
+    return (void*) g_value_get_ulong (value);
+  if (G_VALUE_HOLDS_FLOAT (value))
+    return (void*) (gssize) g_value_get_float (value);
+  if (G_VALUE_HOLDS_DOUBLE (value))
+    return (void*) (gssize) g_value_get_double (value);
+  if (G_VALUE_HOLDS_ENUM (value))
+    return (void*) (gssize) g_value_get_enum (value);
+  if (G_VALUE_HOLDS_FLAGS (value))
+    return (void*) (gsize) g_value_get_flags (value);
+  return (void*) 0x1373babe;
+}
+
+static void
+object_test_property (GObject           *object,
+                      GParamSpec        *pspec,
+                      double             dvalue)
+{
+  /* test setting of a normal writable property */
+  if (pspec->flags & G_PARAM_WRITABLE &&
+      !(pspec->flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY)))
+    {
+      GValue value = { 0, };
+      guint i;
+      const IgnoreProperty *ignore_properties;
+      /* select value to set */
+      g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec));
+      pspec_select_value (pspec, &value, dvalue);
+      /* ignore untestable properties */
+      ignore_properties = list_ignore_properties (FALSE);
+      for (i = 0; ignore_properties[i].name; i++)
+        if (g_type_is_a (G_OBJECT_TYPE (object), g_type_from_name (ignore_properties[i].type_name)) &&
+            strcmp (pspec->name, ignore_properties[i].name) == 0 &&
+            (MATCH_ANY_VALUE == ignore_properties[i].value ||
+             value_as_pointer (&value) == ignore_properties[i].value ||
+             (G_VALUE_HOLDS_STRING (&value) &&
+              strcmp (g_value_get_string (&value), ignore_properties[i].value) == 0)))
+          break;
+      /* ignore known property bugs if not testing thoroughly */
+      if (ignore_properties[i].name == NULL && !g_test_thorough())
+        {
+          ignore_properties = list_ignore_properties (TRUE);
+          for (i = 0; ignore_properties[i].name; i++)
+            if (g_type_is_a (G_OBJECT_TYPE (object), g_type_from_name (ignore_properties[i].type_name)) &&
+                strcmp (pspec->name, ignore_properties[i].name) == 0 &&
+                (MATCH_ANY_VALUE == ignore_properties[i].value ||
+                 value_as_pointer (&value) == ignore_properties[i].value ||
+                 (G_VALUE_HOLDS_STRING (&value) &&
+                  strcmp (g_value_get_string (&value), ignore_properties[i].value) == 0)))
+              break;
+        }
+      /* assign unignored properties */
+      if (ignore_properties[i].name == NULL)
+        {
+          if (g_test_verbose())
+            g_print ("PropertyTest: %s::%s := (%s value (%s): %p)\n",
+                     g_type_name (G_OBJECT_TYPE (object)), pspec->name,
+                     SELECT_NAME (dvalue), g_type_name (G_VALUE_TYPE (&value)),
+                     value_as_pointer (&value));
+          g_object_set_property (object, pspec->name, &value);
+        }
+      /* cleanups */
+      g_value_unset (&value);
+    }
+}
+
+static void
+widget_test_properties (GtkWidget   *widget,
+                        double       dvalue)
+{
+  /* try setting all possible properties, according to dvalue */
+  guint i, n_pspecs = 0;
+  GParamSpec **pspecs = g_object_class_list_properties (G_OBJECT_GET_CLASS (widget), &n_pspecs);
+  for (i = 0; i < n_pspecs; i++)
+    {
+      GParamSpec *pspec = pspecs[i];
+      if (pspec->flags & G_PARAM_WRITABLE &&
+          !(pspec->flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY)))
+        object_test_property (G_OBJECT (widget), pspecs[i], dvalue);
+    }
+  g_free (pspecs);
+}
+
+static void
+widget_fixups (GtkWidget *widget)
+{
+  /* post-constructor for widgets that need additional settings to work correctly */
+  if (GTK_IS_COMBO_BOX_ENTRY (widget))
+    {
+      GtkListStore *store = gtk_list_store_new (1, G_TYPE_STRING);
+      g_object_set (widget, "model", store, "text-column", 0, NULL);
+      g_object_unref (store);
+      gtk_combo_box_append_text (GTK_COMBO_BOX (widget), "test text");
+    }
+  else if (GTK_IS_COMBO_BOX (widget))
+    {
+      GtkListStore *store = gtk_list_store_new (1, G_TYPE_STRING);
+      g_object_set (widget, "model", store, NULL);
+      g_object_unref (store);
+      gtk_combo_box_append_text (GTK_COMBO_BOX (widget), "test text");
+    }
+}
+
+static void
+widget_property_tests (gconstpointer test_data)
+{
+  GType wtype = (GType) test_data;
+  /* create widget */
+  GtkWidget *widget = gtk_widget_new (wtype, NULL);
+  g_object_ref_sink (widget);
+  widget_fixups (widget);
+  /* test property values */
+  widget_test_properties (widget,  +2); /* test default_value */
+  widget_test_properties (widget,   0); /* test minimum */
+  widget_test_properties (widget, 0.5); /* test medium */
+  widget_test_properties (widget,   1); /* test maximum */
+  widget_test_properties (widget,  -1); /* test random value */
+  /* cleanup */
+  gtk_widget_destroy (widget);
+  g_object_unref (widget);
+}
+
+extern void pixbuf_init (void);
+
+/* --- main test program --- */
+int
+main (int   argc,
+      char *argv[])
+{
+  const GType *otypes;
+  guint i;
+  /* initialize test program */
+  pixbuf_init ();
+  gtk_test_init (&argc, &argv);
+  gtk_test_register_all_types();
+  /* install a property test for each widget type */
+  otypes = gtk_test_list_all_types (NULL);
+  for (i = 0; otypes[i]; i++)
+    if (g_type_is_a (otypes[i], GTK_TYPE_WIDGET) &&
+        G_TYPE_IS_OBJECT (otypes[i]) &&
+        !G_TYPE_IS_ABSTRACT (otypes[i]))
+      {
+        gchar *testpath = g_strdup_printf ("/properties/%s", g_type_name (otypes[i]));
+        g_test_add_data_func (testpath, (void*) otypes[i], widget_property_tests);
+        g_free (testpath);
+      }
+  return g_test_run();
+}
diff --git a/gtk/tests/pixbuf-init.c b/gtk/tests/pixbuf-init.c
new file mode 100644 (file)
index 0000000..17c1223
--- /dev/null
@@ -0,0 +1,20 @@
+#include <config.h>
+#include <glib.h>
+
+#include <sys/stat.h>
+#include <stdlib.h>
+
+static gboolean
+file_exists (const char *filename)
+{
+  struct stat statbuf;
+
+  return stat (filename, &statbuf) == 0;
+}
+
+void
+pixbuf_init (void)
+{
+  if (file_exists ("../../gdk-pixbuf/libpixbufloader-pnm.la"))
+    g_setenv ("GDK_PIXBUF_MODULE_FILE", "../../gdk-pixbuf/gdk-pixbuf.loaders", TRUE);
+}
diff --git a/gtk/tests/textbuffer.c b/gtk/tests/textbuffer.c
new file mode 100644 (file)
index 0000000..3fdbf9f
--- /dev/null
@@ -0,0 +1,1308 @@
+/* testtextbuffer.c -- Simplistic test suite
+ * Copyright (C) 2000 Red Hat, Inc
+ * Author: Havoc Pennington
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <gtk/gtk.h>
+#include "gtk/gtktexttypes.h" /* Private header, for UNKNOWN_CHAR */
+
+static void
+gtk_text_iter_spew (const GtkTextIter *iter, const gchar *desc)
+{
+  g_print (" %20s: line %d / char %d / line char %d / line byte %d\n",
+           desc,
+           gtk_text_iter_get_line (iter),
+           gtk_text_iter_get_offset (iter),
+           gtk_text_iter_get_line_offset (iter),
+           gtk_text_iter_get_line_index (iter));
+}
+
+static void
+check_get_set_text (GtkTextBuffer *buffer,
+                    const char    *str)
+{
+  GtkTextIter start, end, iter;
+  char *text;
+  int n;
+  
+  gtk_text_buffer_set_text (buffer, str, -1);
+  if (gtk_text_buffer_get_char_count (buffer) != g_utf8_strlen (str, -1))
+    g_error ("Wrong number of chars (%d not %d)",
+             gtk_text_buffer_get_char_count (buffer),
+             (int) g_utf8_strlen (str, -1));
+  gtk_text_buffer_get_bounds (buffer, &start, &end);
+  text = gtk_text_buffer_get_text (buffer, &start, &end, TRUE);
+  if (strcmp (text, str) != 0)
+    g_error ("Got '%s' as buffer contents", text);
+  g_free (text);
+
+  /* line char counts */
+  iter = start;
+  n = 0;
+  do
+    {
+      n += gtk_text_iter_get_chars_in_line (&iter);
+    }
+  while (gtk_text_iter_forward_line (&iter));
+
+  if (n != gtk_text_buffer_get_char_count (buffer))
+    g_error ("Sum of chars in lines is %d but buffer char count is %d",
+             n, gtk_text_buffer_get_char_count (buffer));
+
+  /* line byte counts */
+  iter = start;
+  n = 0;
+  do
+    {
+      n += gtk_text_iter_get_bytes_in_line (&iter);
+    }
+  while (gtk_text_iter_forward_line (&iter));
+
+  if (n != strlen (str))
+    g_error ("Sum of chars in lines is %d but buffer byte count is %d",
+             n, (int) strlen (str));
+  
+  gtk_text_buffer_set_text (buffer, "", -1);
+
+  n = gtk_text_buffer_get_line_count (buffer);
+  if (n != 1)
+    g_error ("%d lines, expected 1", n);
+
+  n = gtk_text_buffer_get_char_count (buffer);
+  if (n != 0)
+    g_error ("%d chars, expected 0", n);
+}
+
+static gint
+count_toggles_at_iter (GtkTextIter *iter,
+                       GtkTextTag  *of_tag)
+{
+  GSList *tags;
+  GSList *tmp;
+  gint count = 0;
+  
+  /* get toggle-ons and toggle-offs */
+  tags = gtk_text_iter_get_toggled_tags (iter, TRUE);
+  tags = g_slist_concat (tags,
+                         gtk_text_iter_get_toggled_tags (iter, FALSE));
+  
+  tmp = tags;
+  while (tmp != NULL)
+    {
+      if (of_tag == NULL)
+        ++count;
+      else if (of_tag == tmp->data)
+        ++count;
+      
+      tmp = g_slist_next (tmp);
+    }
+  
+  g_slist_free (tags);
+
+  return count;
+}
+
+static gint
+count_toggles_in_range_by_char (GtkTextBuffer     *buffer,
+                                GtkTextTag        *of_tag,
+                                const GtkTextIter *start,
+                                const GtkTextIter *end)
+{
+  GtkTextIter iter;
+  gint count = 0;
+  
+  iter = *start;
+  do
+    {
+      count += count_toggles_at_iter (&iter, of_tag);
+      if (!gtk_text_iter_forward_char (&iter))
+        {
+          /* end iterator */
+          count += count_toggles_at_iter (&iter, of_tag);
+          break;
+        }
+    }
+  while (gtk_text_iter_compare (&iter, end) <= 0);
+  
+  return count;
+}
+
+static gint
+count_toggles_in_buffer (GtkTextBuffer *buffer,
+                         GtkTextTag    *of_tag)
+{
+  GtkTextIter start, end;
+
+  gtk_text_buffer_get_bounds (buffer, &start, &end);
+
+  return count_toggles_in_range_by_char (buffer, of_tag, &start, &end);
+}
+
+static void
+check_specific_tag_in_range (GtkTextBuffer     *buffer,
+                             const gchar       *tag_name,
+                             const GtkTextIter *start,
+                             const GtkTextIter *end)
+{
+  GtkTextIter iter;
+  GtkTextTag *tag;
+  gboolean state;
+  gint count;
+  gint buffer_count;
+  gint last_offset;
+
+  if (gtk_text_iter_compare (start, end) > 0)
+    {
+      g_print ("  (inverted range for checking tags, skipping)\n");
+      return;
+    }
+  
+  tag = gtk_text_tag_table_lookup (gtk_text_buffer_get_tag_table (buffer),
+                                   tag_name);
+
+  buffer_count = count_toggles_in_range_by_char (buffer, tag, start, end);
+  
+  state = FALSE;
+  count = 0;
+
+  last_offset = -1;
+  iter = *start;
+  if (gtk_text_iter_toggles_tag (&iter, tag) ||
+      gtk_text_iter_forward_to_tag_toggle (&iter, tag))
+    {
+      do
+        {
+          gint this_offset;
+          
+          ++count;
+
+          this_offset = gtk_text_iter_get_offset (&iter);
+
+          if (this_offset <= last_offset)
+            g_error ("forward_to_tag_toggle moved in wrong direction");
+
+          last_offset = this_offset;
+          
+          if (gtk_text_iter_begins_tag (&iter, tag))
+            {
+              if (state)
+                g_error ("Tag %p is already on, and was toggled on?", tag);
+              state = TRUE;
+            }          
+          else if (gtk_text_iter_ends_tag (&iter, tag))
+            {
+              if (!state)
+                g_error ("Tag %p toggled off, but wasn't toggled on?", tag);
+              state = FALSE;
+            }
+          else
+            g_error ("forward_to_tag_toggle went to a location without a toggle");
+        }
+      while (gtk_text_iter_forward_to_tag_toggle (&iter, tag) &&
+             gtk_text_iter_compare (&iter, end) <= 0);
+    }
+
+  if (count != buffer_count)
+    g_error ("Counted %d tags iterating by char, %d iterating forward by tag toggle\n",
+             buffer_count, count);
+  
+  state = FALSE;
+  count = 0;
+  
+  iter = *end;
+  last_offset = gtk_text_iter_get_offset (&iter);
+  if (gtk_text_iter_toggles_tag (&iter, tag) ||
+      gtk_text_iter_backward_to_tag_toggle (&iter, tag))
+    {
+      do
+        {
+          gint this_offset;
+          
+          ++count;
+
+          this_offset = gtk_text_iter_get_offset (&iter);
+          
+          if (this_offset >= last_offset)
+            g_error ("backward_to_tag_toggle moved in wrong direction");
+          
+          last_offset = this_offset;
+
+          if (gtk_text_iter_begins_tag (&iter, tag))
+            {
+              if (!state)
+                g_error ("Tag %p wasn't on when we got to the on toggle going backward?", tag);
+              state = FALSE;
+            }
+          else if (gtk_text_iter_ends_tag (&iter, tag))
+            {
+              if (state)
+                g_error ("Tag %p off toggle, but we were already inside a tag?", tag);
+              state = TRUE;
+            }
+          else
+            g_error ("backward_to_tag_toggle went to a location without a toggle");
+        }
+      while (gtk_text_iter_backward_to_tag_toggle (&iter, tag) &&
+             gtk_text_iter_compare (&iter, start) >= 0);
+    }
+
+  if (count != buffer_count)
+    g_error ("Counted %d tags iterating by char, %d iterating backward by tag toggle\n",
+             buffer_count, count);
+}
+
+static void
+check_specific_tag (GtkTextBuffer *buffer,
+                    const gchar   *tag_name)
+{
+  GtkTextIter start, end;
+
+  gtk_text_buffer_get_bounds (buffer, &start, &end);
+  check_specific_tag_in_range (buffer, tag_name, &start, &end);
+  gtk_text_iter_forward_chars (&start, 2);
+  gtk_text_iter_backward_chars (&end, 2);
+  if (gtk_text_iter_compare (&start, &end) < 0)
+    check_specific_tag_in_range (buffer, tag_name, &start, &end);
+}
+
+static void
+run_tests (GtkTextBuffer *buffer)
+{
+  GtkTextIter iter;
+  GtkTextIter start;
+  GtkTextIter end;
+  GtkTextIter mark;
+  gint i, j;
+  gint num_chars;
+  GtkTextMark *bar_mark;
+  GtkTextTag *tag;
+  GHashTable *tag_states;
+  gint count;
+  gint buffer_count;
+  
+  gtk_text_buffer_get_bounds (buffer, &start, &end);
+
+  /* Check that walking the tree via chars and via iterators produces
+   * the same number of indexable locations.
+   */
+  num_chars = gtk_text_buffer_get_char_count (buffer);
+  iter = start;
+  bar_mark = gtk_text_buffer_create_mark (buffer, "bar", &iter, FALSE);
+  i = 0;
+  while (i < num_chars)
+    {
+      GtkTextIter current;
+      GtkTextMark *foo_mark;
+
+      gtk_text_buffer_get_iter_at_offset (buffer, &current, i);
+
+      if (!gtk_text_iter_equal (&iter, &current))
+        {
+          g_error ("get_char_index didn't return current iter");
+        }
+
+      j = gtk_text_iter_get_offset (&iter);
+
+      if (i != j)
+        {
+          g_error ("iter converted to %d not %d", j, i);
+        }
+
+      /* get/set mark */
+      gtk_text_buffer_get_iter_at_mark (buffer, &mark, bar_mark);
+
+      if (!gtk_text_iter_equal (&iter, &mark))
+        {
+          gtk_text_iter_spew (&iter, "iter");
+          gtk_text_iter_spew (&mark, "mark");
+          g_error ("Mark not moved to the right place.");
+        }
+
+      foo_mark = gtk_text_buffer_create_mark (buffer, "foo", &iter, FALSE);
+      gtk_text_buffer_get_iter_at_mark (buffer, &mark, foo_mark);
+      gtk_text_buffer_delete_mark (buffer, foo_mark);
+
+      if (!gtk_text_iter_equal (&iter, &mark))
+        {
+          gtk_text_iter_spew (&iter, "iter");
+          gtk_text_iter_spew (&mark, "mark");
+          g_error ("Mark not created in the right place.");
+        }
+
+      if (gtk_text_iter_is_end (&iter))
+        g_error ("iterators ran out before chars (offset %d of %d)",
+                 i, num_chars);
+
+      gtk_text_iter_forward_char (&iter);
+
+      gtk_text_buffer_move_mark (buffer, bar_mark, &iter);
+
+      ++i;
+    }
+
+  if (!gtk_text_iter_equal (&iter, &end))
+    g_error ("Iterating over all chars didn't end with the end iter");
+
+  /* Do the tree-walk backward
+   */
+  num_chars = gtk_text_buffer_get_char_count (buffer);
+  gtk_text_buffer_get_iter_at_offset (buffer, &iter, -1);
+
+  gtk_text_buffer_move_mark (buffer, bar_mark, &iter);
+
+  i = num_chars;
+
+  if (!gtk_text_iter_equal (&iter, &end))
+    g_error ("iter at char -1 is not equal to the end iterator");
+
+  while (i >= 0)
+    {
+      GtkTextIter current;
+      GtkTextMark *foo_mark;
+
+      gtk_text_buffer_get_iter_at_offset (buffer, &current, i);
+
+      if (!gtk_text_iter_equal (&iter, &current))
+        {
+          g_error ("get_char_index didn't return current iter while going backward");
+        }
+      j = gtk_text_iter_get_offset (&iter);
+
+      if (i != j)
+        {
+          g_error ("going backward, iter converted to %d not %d", j, i);
+        }
+
+      /* get/set mark */
+      gtk_text_buffer_get_iter_at_mark (buffer, &mark, bar_mark);
+
+      if (!gtk_text_iter_equal (&iter, &mark))
+        {
+          gtk_text_iter_spew (&iter, "iter");
+          gtk_text_iter_spew (&mark, "mark");
+          g_error ("Mark not moved to the right place.");
+        }
+
+      foo_mark = gtk_text_buffer_create_mark (buffer, "foo", &iter, FALSE);
+      gtk_text_buffer_get_iter_at_mark (buffer, &mark, foo_mark);
+      gtk_text_buffer_delete_mark (buffer, foo_mark);
+
+      if (!gtk_text_iter_equal (&iter, &mark))
+        {
+          gtk_text_iter_spew (&iter, "iter");
+          gtk_text_iter_spew (&mark, "mark");
+          g_error ("Mark not created in the right place.");
+        }
+
+      if (i > 0)
+        {
+          if (!gtk_text_iter_backward_char (&iter))
+            g_error ("iterators ran out before char indexes");
+
+          gtk_text_buffer_move_mark (buffer, bar_mark, &iter);
+        }
+      else
+        {
+          if (gtk_text_iter_backward_char (&iter))
+            g_error ("went backward from 0?");
+        }
+
+      --i;
+    }
+
+  if (!gtk_text_iter_equal (&iter, &start))
+    g_error ("Iterating backward over all chars didn't end with the start iter");
+
+  /*
+   * Check that get_line_count returns the same number of lines
+   * as walking the tree by line
+   */
+  i = 1; /* include current (first) line */
+  gtk_text_buffer_get_iter_at_line (buffer, &iter, 0);
+  while (gtk_text_iter_forward_line (&iter))
+    ++i;
+
+  if (i != gtk_text_buffer_get_line_count (buffer))
+    g_error ("Counted %d lines, buffer has %d", i,
+             gtk_text_buffer_get_line_count (buffer));
+
+  /*
+   * Check that moving over tag toggles thinks about working.
+   */
+
+  buffer_count = count_toggles_in_buffer (buffer, NULL);
+  
+  tag_states = g_hash_table_new (NULL, NULL);
+  count = 0;
+  
+  gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
+  if (gtk_text_iter_toggles_tag (&iter, NULL) ||
+      gtk_text_iter_forward_to_tag_toggle (&iter, NULL))
+    {
+      do
+        {
+          GSList *tags;
+          GSList *tmp;
+          gboolean found_some = FALSE;
+          
+          /* get toggled-on tags */
+          tags = gtk_text_iter_get_toggled_tags (&iter, TRUE);
+
+          if (tags)
+            found_some = TRUE;
+          
+          tmp = tags;
+          while (tmp != NULL)
+            {
+              ++count;
+              
+              tag = tmp->data;
+              
+              if (g_hash_table_lookup (tag_states, tag))
+                g_error ("Tag %p is already on, and was toggled on?", tag);
+
+              g_hash_table_insert (tag_states, tag, GINT_TO_POINTER (TRUE));
+          
+              tmp = g_slist_next (tmp);
+            }
+
+          g_slist_free (tags);
+      
+          /* get toggled-off tags */
+          tags = gtk_text_iter_get_toggled_tags (&iter, FALSE);
+
+          if (tags)
+            found_some = TRUE;
+          
+          tmp = tags;
+          while (tmp != NULL)
+            {
+              ++count;
+              
+              tag = tmp->data;
+
+              if (!g_hash_table_lookup (tag_states, tag))
+                g_error ("Tag %p is already off, and was toggled off?", tag);
+
+              g_hash_table_remove (tag_states, tag);
+          
+              tmp = g_slist_next (tmp);
+            }
+
+          g_slist_free (tags);
+
+          if (!found_some)
+            g_error ("No tags found going forward to tag toggle.");
+
+        }
+      while (gtk_text_iter_forward_to_tag_toggle (&iter, NULL));
+    }
+  
+  g_hash_table_destroy (tag_states);
+
+  if (count != buffer_count)
+    g_error ("Counted %d tags iterating by char, %d iterating by tag toggle\n",
+             buffer_count, count);
+  
+  /* Go backward; here TRUE in the hash means we saw
+   * an off toggle last.
+   */
+  
+  tag_states = g_hash_table_new (NULL, NULL);
+  count = 0;
+  
+  gtk_text_buffer_get_end_iter (buffer, &iter);
+  if (gtk_text_iter_toggles_tag (&iter, NULL) ||
+      gtk_text_iter_backward_to_tag_toggle (&iter, NULL))
+    {
+      do
+        {
+          GSList *tags;
+          GSList *tmp;
+          gboolean found_some = FALSE;
+          
+          /* get toggled-off tags */
+          tags = gtk_text_iter_get_toggled_tags (&iter, FALSE);
+
+          if (tags)
+            found_some = TRUE;
+          
+          tmp = tags;
+          while (tmp != NULL)
+            {
+              ++count;
+              
+              tag = tmp->data;
+
+              if (g_hash_table_lookup (tag_states, tag))
+                g_error ("Tag %p has two off-toggles in a row?", tag);
+          
+              g_hash_table_insert (tag_states, tag, GINT_TO_POINTER (TRUE));
+          
+              tmp = g_slist_next (tmp);
+            }
+
+          g_slist_free (tags);
+      
+          /* get toggled-on tags */
+          tags = gtk_text_iter_get_toggled_tags (&iter, TRUE);
+
+          if (tags)
+            found_some = TRUE;
+          
+          tmp = tags;
+          while (tmp != NULL)
+            {
+              ++count;
+              
+              tag = tmp->data;
+
+              if (!g_hash_table_lookup (tag_states, tag))
+                g_error ("Tag %p was toggled on, but saw no off-toggle?", tag);
+
+              g_hash_table_remove (tag_states, tag);
+          
+              tmp = g_slist_next (tmp);
+            }
+
+          g_slist_free (tags);
+
+          if (!found_some)
+            g_error ("No tags found going backward to tag toggle.");
+        }
+      while (gtk_text_iter_backward_to_tag_toggle (&iter, NULL));
+    }
+  
+  g_hash_table_destroy (tag_states);
+
+  if (count != buffer_count)
+    g_error ("Counted %d tags iterating by char, %d iterating by tag toggle\n",
+             buffer_count, count);
+
+  check_specific_tag (buffer, "fg_red");
+  check_specific_tag (buffer, "bg_green");
+  check_specific_tag (buffer, "front_tag");
+  check_specific_tag (buffer, "center_tag");
+  check_specific_tag (buffer, "end_tag");
+}
+
+
+static const char  *book_closed_xpm[] = {
+"16 16 6 1",
+"       c None s None",
+".      c black",
+"X      c red",
+"o      c yellow",
+"O      c #808080",
+"#      c white",
+"                ",
+"       ..       ",
+"     ..XX.      ",
+"   ..XXXXX.     ",
+" ..XXXXXXXX.    ",
+".ooXXXXXXXXX.   ",
+"..ooXXXXXXXXX.  ",
+".X.ooXXXXXXXXX. ",
+".XX.ooXXXXXX..  ",
+" .XX.ooXXX..#O  ",
+"  .XX.oo..##OO. ",
+"   .XX..##OO..  ",
+"    .X.#OO..    ",
+"     ..O..      ",
+"      ..        ",
+"                "};
+
+static void
+fill_buffer (GtkTextBuffer *buffer)
+{
+  GtkTextTag *tag;
+  GdkColor color, color2;
+  GtkTextIter iter;
+  GtkTextIter iter2;
+  GdkPixbuf *pixbuf;
+  int i;
+
+  color.red = color.green = 0;
+  color.blue = 0xffff;
+  color2.red = 0xfff;
+  color2.blue = 0x0;
+  color2.green = 0;
+  
+  gtk_text_buffer_create_tag (buffer, "fg_blue",
+                              "foreground_gdk", &color,
+                              "background_gdk", &color2,
+                              "font", "-*-courier-bold-r-*-*-30-*-*-*-*-*-*-*",
+                              NULL);
+
+  color.blue = color.green = 0;
+  color.red = 0xffff;
+  
+  gtk_text_buffer_create_tag (buffer, "fg_red",
+                              "rise", -4,
+                              "foreground_gdk", &color,
+                              NULL);
+
+  color.blue = color.red = 0;
+  color.green = 0xffff;
+  
+  gtk_text_buffer_create_tag (buffer, "bg_green",
+                              "background_gdk", &color,
+                              "font", "-*-courier-bold-r-*-*-10-*-*-*-*-*-*-*",
+                              NULL);
+
+  pixbuf = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
+
+  g_assert (pixbuf != NULL);
+
+  i = 0;
+  while (i < 10)
+    {
+      gchar *str;
+
+      gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
+
+      gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
+
+      gtk_text_buffer_get_iter_at_offset (buffer, &iter, 1);
+
+      gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
+
+      str = g_strdup_printf ("%d Hello World!\nwoo woo woo woo woo woo woo woo\n",
+                            i);
+
+      gtk_text_buffer_insert (buffer, &iter, str, -1);
+
+      g_free (str);
+
+      gtk_text_buffer_insert (buffer, &iter,
+                              "(Hello World!)\nfoo foo Hello this is some text we are using to text word wrap. It has punctuation! gee; blah - hmm, great.\nnew line\n\n"
+                              /* This is UTF8 stuff, Emacs doesn't
+                                 really know how to display it */
+                              "Spanish (Espa\303\261ol) \302\241Hola! / French (Fran\303\247ais) Bonjour, Salut / German (Deutsch S\303\274d) Gr\303\274\303\237 Gott (testing Latin-1 chars encoded in UTF8)\nThai (we can't display this, just making sure we don't crash)  (\340\270\240\340\270\262\340\270\251\340\270\262\340\271\204\340\270\227\340\270\242)  \340\270\252\340\270\247\340\270\261\340\270\252\340\270\224\340\270\265\340\270\204\340\270\243\340\270\261\340\270\232, \340\270\252\340\270\247\340\270\261\340\270\252\340\270\224\340\270\265\340\270\204\340\271\210\340\270\260\n",
+                              -1);
+
+      gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
+      gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
+
+      gtk_text_buffer_get_iter_at_offset (buffer, &iter, 4);
+
+      gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
+
+      gtk_text_buffer_get_iter_at_offset (buffer, &iter, 7);
+
+      gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
+
+      gtk_text_buffer_get_iter_at_offset (buffer, &iter, 8);
+
+      gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
+
+      gtk_text_buffer_get_iter_at_line_offset (buffer, &iter, 0, 8);
+      iter2 = iter;
+      gtk_text_iter_forward_chars (&iter2, 10);
+
+      gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
+
+      gtk_text_iter_forward_chars (&iter, 7);
+      gtk_text_iter_forward_chars (&iter2, 10);
+
+      gtk_text_buffer_apply_tag_by_name (buffer, "bg_green", &iter, &iter2);
+
+      gtk_text_iter_forward_chars (&iter, 12);
+      gtk_text_iter_forward_chars (&iter2, 10);
+
+      gtk_text_buffer_apply_tag_by_name (buffer, "bg_green", &iter, &iter2);
+
+      gtk_text_iter_forward_chars (&iter, 10);
+      gtk_text_iter_forward_chars (&iter2, 15);
+
+      gtk_text_buffer_apply_tag_by_name (buffer, "fg_red", &iter, &iter2);
+      gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
+
+      gtk_text_iter_forward_chars (&iter, 20);
+      gtk_text_iter_forward_chars (&iter2, 20);
+
+      gtk_text_buffer_apply_tag_by_name (buffer, "fg_red", &iter, &iter2);
+      gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
+
+      gtk_text_iter_backward_chars (&iter, 25);
+      gtk_text_iter_forward_chars (&iter2, 5);
+
+      gtk_text_buffer_apply_tag_by_name (buffer, "fg_red", &iter, &iter2);
+      gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
+
+      gtk_text_iter_forward_chars (&iter, 15);
+      gtk_text_iter_backward_chars (&iter2, 10);
+
+      gtk_text_buffer_remove_tag_by_name (buffer, "fg_red", &iter, &iter2);
+      gtk_text_buffer_remove_tag_by_name (buffer, "fg_blue", &iter, &iter2);
+
+      ++i;
+    }
+
+  /* Put in tags that are just at the beginning, and just near the end,
+   * and just near the middle.
+   */
+  tag = gtk_text_buffer_create_tag (buffer, "front_tag", NULL);
+  gtk_text_buffer_get_iter_at_offset (buffer, &iter, 3);
+  gtk_text_buffer_get_iter_at_offset (buffer, &iter2, 300);
+
+  gtk_text_buffer_apply_tag (buffer, tag, &iter, &iter2);  
+  
+  tag = gtk_text_buffer_create_tag (buffer, "end_tag", NULL);
+  gtk_text_buffer_get_end_iter (buffer, &iter2);
+  gtk_text_iter_backward_chars (&iter2, 12);
+  iter = iter2;
+  gtk_text_iter_backward_chars (&iter, 157);
+
+  gtk_text_buffer_apply_tag (buffer, tag, &iter, &iter2);
+  
+  tag = gtk_text_buffer_create_tag (buffer, "center_tag", NULL);
+  gtk_text_buffer_get_iter_at_offset (buffer, &iter,
+                                      gtk_text_buffer_get_char_count (buffer)/2);
+  gtk_text_iter_backward_chars (&iter, 37);
+  iter2 = iter;
+  gtk_text_iter_forward_chars (&iter2, 57);
+
+  gtk_text_buffer_apply_tag (buffer, tag, &iter, &iter2);  
+
+  g_object_unref (pixbuf);
+}
+
+
+/*
+ * Line separator tests (initially to avoid regression on bugzilla #57428)
+ */
+
+static void
+test_line_separation (const char* str,
+                      gboolean    expect_next_line,
+                      gboolean    expect_end_iter,
+                      int         expected_line_count,
+                      int         expected_line_break,
+                      int         expected_next_line_start)
+{
+  GtkTextIter iter;
+  GtkTextBuffer* buffer;
+  gboolean on_next_line;
+  gboolean on_end_iter;
+  gint new_pos;
+
+  buffer = gtk_text_buffer_new (NULL);
+
+  gtk_text_buffer_set_text (buffer, str, -1);
+  gtk_text_buffer_get_iter_at_offset (buffer, &iter, expected_line_break);
+
+  g_assert (gtk_text_iter_ends_line (&iter) || gtk_text_iter_is_end (&iter));
+
+  g_assert (gtk_text_buffer_get_line_count (buffer) == expected_line_count);
+  
+  on_next_line = gtk_text_iter_forward_line (&iter);
+
+  g_assert (expect_next_line == on_next_line);
+
+  on_end_iter = gtk_text_iter_is_end (&iter);
+
+  g_assert (on_end_iter == expect_end_iter);
+  
+  new_pos = gtk_text_iter_get_offset (&iter);
+    
+  if (on_next_line)
+    g_assert (expected_next_line_start == new_pos);
+
+  ++expected_line_break;
+  while (expected_line_break < expected_next_line_start)
+    {
+      gtk_text_buffer_get_iter_at_offset (buffer, &iter, expected_line_break);
+
+      g_assert (!gtk_text_iter_ends_line (&iter));
+
+      on_next_line = gtk_text_iter_forward_line (&iter);
+        
+      g_assert (expect_next_line == on_next_line);
+        
+      new_pos = gtk_text_iter_get_offset (&iter);
+        
+      if (on_next_line)
+        g_assert (expected_next_line_start == new_pos);
+        
+      ++expected_line_break;
+    }
+
+  /* FIXME tests for backward line */
+  
+  g_object_unref (buffer);
+}
+
+/* there are cases where \r and \n should not be treated like \r\n,
+ * originally bug #337022. */
+static void
+split_r_n_separators_test (void)
+{
+  GtkTextBuffer *buffer;
+  GtkTextIter iter;
+
+  buffer = gtk_text_buffer_new (NULL);
+
+  gtk_text_buffer_set_text (buffer, "foo\ra\nbar\n", -1);
+
+  /* delete 'a' so that we have
+
+     1 foo\r
+     2 \n
+     3 bar\n
+
+   * and both \r and \n are line separators */
+
+  gtk_text_buffer_get_iter_at_offset (buffer, &iter, 5);
+  gtk_text_buffer_backspace (buffer, &iter, TRUE, TRUE);
+
+  g_assert (gtk_text_iter_ends_line (&iter));
+
+  gtk_text_buffer_get_iter_at_offset (buffer, &iter, 3);
+  g_assert (gtk_text_iter_ends_line (&iter));
+}
+
+static void
+test_line_separator (void)
+{
+  char *str;
+  char buf[7] = { '\0', };
+
+  /* Only one character has type G_UNICODE_PARAGRAPH_SEPARATOR in
+   * Unicode 3.0; update this if that changes.
+   */
+#define PARAGRAPH_SEPARATOR 0x2029
+  
+  test_line_separation ("line", FALSE, TRUE, 1, 4, 4);
+  test_line_separation ("line\r\n", FALSE, TRUE, 2, 4, 6);
+  test_line_separation ("line\r", FALSE, TRUE, 2, 4, 5);
+  test_line_separation ("line\n", FALSE, TRUE, 2, 4, 5);
+  test_line_separation ("line\rqw", TRUE, FALSE, 2, 4, 5);
+  test_line_separation ("line\nqw", TRUE, FALSE, 2, 4, 5);
+  test_line_separation ("line\r\nqw", TRUE, FALSE, 2, 4, 6);
+  
+  g_unichar_to_utf8 (PARAGRAPH_SEPARATOR, buf);
+  
+  str = g_strdup_printf ("line%s", buf);
+  test_line_separation (str, FALSE, TRUE, 2, 4, 5);
+  g_free (str);
+  str = g_strdup_printf ("line%sqw", buf);
+  test_line_separation (str, TRUE, FALSE, 2, 4, 5);
+  g_free (str);
+
+  split_r_n_separators_test ();
+}
+
+static void
+test_logical_motion (void)
+{
+  char *str;
+  char buf1[7] = { '\0', };
+  char buf2[7] = { '\0', };
+  char buf3[7] = { '\0', };
+  int expected[30];
+  int expected_steps;
+  int i;
+  GtkTextBuffer *buffer;
+  GtkTextIter iter;
+  
+  buffer = gtk_text_buffer_new (NULL);
+  
+#define LEADING_JAMO 0x1111
+#define VOWEL_JAMO 0x1167
+#define TRAILING_JAMO 0x11B9
+  
+  g_unichar_to_utf8 (LEADING_JAMO, buf1);
+  g_unichar_to_utf8 (VOWEL_JAMO, buf2);
+  g_unichar_to_utf8 (TRAILING_JAMO, buf3);
+
+  /* Build the string "abc<leading><vowel><trailing>def\r\nxyz" */
+  str = g_strconcat ("abc", buf1, buf2, buf3, "def\r\nxyz", NULL);
+  gtk_text_buffer_set_text (buffer, str, -1);
+  g_free (str);
+  
+  /* Check cursor positions */
+  memset (expected, 0, sizeof (expected));
+  expected[0] = 0;    /* before 'a' */
+  expected[1] = 1;    /* before 'b' */
+  expected[2] = 2;    /* before 'c' */
+  expected[3] = 3;    /* before jamo */
+  expected[4] = 6;    /* before 'd' */
+  expected[5] = 7;    /* before 'e' */
+  expected[6] = 8;    /* before 'f' */
+  expected[7] = 9;    /* before '\r' */
+  expected[8] = 11;   /* before 'x' */
+  expected[9] = 12;   /* before 'y' */
+  expected[10] = 13;  /* before 'z' */
+  expected[11] = 14;  /* after 'z' (only matters going backward) */
+  expected_steps = 11;
+  
+  gtk_text_buffer_get_start_iter (buffer, &iter);
+  i = 0;
+  do
+    {
+      int pos;
+
+      pos = gtk_text_iter_get_offset (&iter);
+      
+      if (pos != expected[i])
+        {
+          g_error ("Cursor position %d, expected %d",
+                   pos, expected[i]);
+        }
+
+      ++i;      
+    }
+  while (gtk_text_iter_forward_cursor_position (&iter));
+
+  if (!gtk_text_iter_is_end (&iter))
+    g_error ("Expected to stop at the end iterator\n");
+
+  if (!gtk_text_iter_is_cursor_position (&iter))
+    g_error ("Should be a cursor position before the end iterator");
+  
+  if (i != expected_steps)
+    g_error ("Expected %d steps, there were actually %d\n", expected_steps, i);
+
+  i = expected_steps;
+  do
+    {
+      int pos;
+
+      pos = gtk_text_iter_get_offset (&iter);
+      
+      if (pos != expected[i])
+        {
+          g_error ("Moving backward, cursor position %d, expected %d",
+                   pos, expected[i]);
+        }
+
+      /* g_print ("%d = %d\n", pos, expected[i]); */
+      
+      --i;
+    }
+  while (gtk_text_iter_backward_cursor_position (&iter));
+
+  if (i != -1)
+    g_error ("Expected %d steps, there were actually %d\n", expected_steps - i, i);
+
+  if (!gtk_text_iter_is_start (&iter))
+    g_error ("Expected to stop at the start iterator\n");
+
+
+  /* Check sentence boundaries */
+  
+  gtk_text_buffer_set_text (buffer, "Hi.\nHi. \nHi! Hi. Hi? Hi.", -1);
+
+  memset (expected, 0, sizeof (expected));
+
+  expected[0] = 0;    /* before first Hi */
+  expected[1] = 3;    /* After first . */
+  expected[2] = 7;    /* After second . */
+  expected[3] = 12;   /* After ! */
+  expected[4] = 16;   /* After third . */
+  expected[5] = 20;   /* After ? */
+  
+  expected_steps = 6;
+  
+  gtk_text_buffer_get_start_iter (buffer, &iter);
+  i = 0;
+  do
+    {
+      int pos;
+
+      pos = gtk_text_iter_get_offset (&iter);
+
+      if (pos != expected[i])
+        {
+          g_error ("Sentence position %d, expected %d",
+                   pos, expected[i]);
+        }
+
+      if (i != 0 &&
+          !gtk_text_iter_is_end (&iter) &&
+          !gtk_text_iter_ends_sentence (&iter))
+        g_error ("Iterator at %d should end a sentence", pos);
+      
+      ++i;
+    }
+  while (gtk_text_iter_forward_sentence_end (&iter));
+
+  if (i != expected_steps)
+    g_error ("Expected %d steps, there were actually %d\n", expected_steps, i);
+
+  if (!gtk_text_iter_is_end (&iter))
+    g_error ("Expected to stop at the end iterator\n");
+  
+  gtk_text_buffer_set_text (buffer, "Hi.\nHi. \nHi! Hi. Hi? Hi.", -1);
+
+  memset (expected, 0, sizeof (expected));
+
+  expected[0] = 24;
+  expected[1] = 21;
+  expected[2] = 17;
+  expected[3] = 13;
+  expected[4] = 9;
+  expected[5] = 4;
+  expected[6] = 0;
+  
+  expected_steps = 7;
+  
+  gtk_text_buffer_get_end_iter (buffer, &iter);
+  i = 0;
+  do
+    {
+      int pos;
+
+      pos = gtk_text_iter_get_offset (&iter);
+
+      if (pos != expected[i])
+        {
+          g_error ("Sentence position %d, expected %d",
+                   pos, expected[i]);
+        }
+
+      if (pos != 0 &&
+          !gtk_text_iter_is_end (&iter) &&
+          !gtk_text_iter_starts_sentence (&iter))
+        g_error ("Iterator at %d should start a sentence", pos);
+      
+      ++i;
+    }
+  while (gtk_text_iter_backward_sentence_start (&iter));
+
+  if (i != expected_steps)
+    g_error ("Expected %d steps, there were actually %d\n", expected_steps, i);
+
+  if (gtk_text_iter_get_offset (&iter) != 0)
+    g_error ("Expected to stop at the start iterator\n");
+  
+  g_object_unref (buffer);
+}
+
+static void
+test_marks (void)
+{
+  GtkTextBuffer *buf1, *buf2;
+  GtkTextMark *mark;
+  GtkTextIter iter;
+
+  buf1 = gtk_text_buffer_new (NULL);
+  buf2 = gtk_text_buffer_new (NULL);
+
+  gtk_text_buffer_get_start_iter (buf1, &iter);
+  mark = gtk_text_buffer_create_mark (buf1, "foo", &iter, TRUE);
+  g_object_ref (mark);
+  gtk_text_mark_set_visible (mark, TRUE);
+  gtk_text_buffer_delete_mark (buf1, mark);
+
+  g_assert (gtk_text_mark_get_visible (mark));
+  g_assert (gtk_text_mark_get_left_gravity (mark));
+  g_assert (!strcmp ("foo", gtk_text_mark_get_name (mark)));
+  g_assert (gtk_text_mark_get_buffer (mark) == NULL);
+  g_assert (gtk_text_mark_get_deleted (mark));
+  g_assert (gtk_text_buffer_get_mark (buf1, "foo") == NULL);
+
+  gtk_text_buffer_get_start_iter (buf2, &iter);
+  gtk_text_buffer_add_mark (buf2, mark, &iter);
+  gtk_text_buffer_insert (buf2, &iter, "ewfwefwefwe", -1);
+  gtk_text_buffer_get_iter_at_mark (buf2, &iter, mark);
+
+  g_assert (gtk_text_mark_get_visible (mark));
+  g_assert (gtk_text_iter_is_start (&iter));
+  g_assert (gtk_text_mark_get_left_gravity (mark));
+  g_assert (!strcmp ("foo", gtk_text_mark_get_name (mark)));
+  g_assert (gtk_text_mark_get_buffer (mark) == buf2);
+  g_assert (!gtk_text_mark_get_deleted (mark));
+  g_assert (gtk_text_buffer_get_mark (buf2, "foo") == mark);
+
+  gtk_text_buffer_delete_mark (buf2, mark);
+  gtk_text_mark_set_visible (mark, FALSE);
+  g_object_unref (mark);
+
+  mark = gtk_text_mark_new ("blah", TRUE);
+  gtk_text_buffer_get_start_iter (buf1, &iter);
+  gtk_text_mark_set_visible (mark, TRUE);
+  gtk_text_buffer_add_mark (buf1, mark, &iter);
+
+  g_assert (gtk_text_mark_get_visible (mark));
+  g_assert (gtk_text_mark_get_buffer (mark) == buf1);
+  g_assert (!gtk_text_mark_get_deleted (mark));
+  g_assert (gtk_text_buffer_get_mark (buf1, "blah") == mark);
+  g_assert (!strcmp ("blah", gtk_text_mark_get_name (mark)));
+
+  gtk_text_mark_set_visible (mark, FALSE);
+  gtk_text_buffer_delete_mark (buf1, mark);
+  g_assert (!gtk_text_mark_get_visible (mark));
+  g_assert (gtk_text_buffer_get_mark (buf1, "blah") == NULL);
+  g_assert (gtk_text_mark_get_buffer (mark) == NULL);
+  g_assert (gtk_text_mark_get_deleted (mark));
+
+  gtk_text_buffer_get_start_iter (buf2, &iter);
+  gtk_text_buffer_add_mark (buf2, mark, &iter);
+  g_assert (gtk_text_mark_get_buffer (mark) == buf2);
+  g_assert (!gtk_text_mark_get_deleted (mark));
+  g_assert (gtk_text_buffer_get_mark (buf2, "blah") == mark);
+  g_assert (!strcmp ("blah", gtk_text_mark_get_name (mark)));
+
+  g_object_unref (mark);
+  g_object_unref (buf1);
+  g_object_unref (buf2);
+}
+
+static void
+test_utf8 (void)
+{
+  gunichar ch;
+
+  /* Check UTF8 unknown char thing */
+  g_assert (g_utf8_strlen (gtk_text_unknown_char_utf8, 3) == 1);
+  ch = g_utf8_get_char (gtk_text_unknown_char_utf8);
+  g_assert (ch == GTK_TEXT_UNKNOWN_CHAR);
+}
+
+static void
+test_empty_buffer (void)
+{
+  GtkTextBuffer *buffer;
+  int n;
+  GtkTextIter start;
+
+  buffer = gtk_text_buffer_new (NULL);
+
+  /* Check that buffer starts with one empty line and zero chars */
+  n = gtk_text_buffer_get_line_count (buffer);
+  if (n != 1)
+    g_error ("%d lines, expected 1", n);
+
+  n = gtk_text_buffer_get_char_count (buffer);
+  if (n != 0)
+    g_error ("%d chars, expected 0", n);
+
+  /* empty first line contains 0 chars */
+  gtk_text_buffer_get_start_iter (buffer, &start);
+  n = gtk_text_iter_get_chars_in_line (&start);
+  if (n != 0)
+    g_error ("%d chars in first line, expected 0", n);
+  n = gtk_text_iter_get_bytes_in_line (&start);
+  if (n != 0)
+    g_error ("%d bytes in first line, expected 0", n);
+  
+  /* Run gruesome alien test suite on buffer */
+  run_tests (buffer);
+
+  g_object_unref (buffer);
+}
+
+static void
+test_get_set(void)
+{
+  GtkTextBuffer *buffer;
+
+  buffer = gtk_text_buffer_new (NULL);
+
+  check_get_set_text (buffer, "Hello");
+  check_get_set_text (buffer, "Hello\n");
+  check_get_set_text (buffer, "Hello\r\n");
+  check_get_set_text (buffer, "Hello\r");
+  check_get_set_text (buffer, "Hello\nBar\nFoo");
+  check_get_set_text (buffer, "Hello\nBar\nFoo\n");
+
+  g_object_unref (buffer);
+}
+
+static void
+test_fill_empty (void)
+{
+  GtkTextBuffer *buffer;
+  int n;
+  GtkTextIter start, end;
+  
+  buffer = gtk_text_buffer_new (NULL);
+
+  /* Put stuff in the buffer */
+  fill_buffer (buffer);
+
+  /* Subject stuff-bloated buffer to further torment */
+  run_tests (buffer);
+
+  /* Delete all stuff from the buffer */
+  gtk_text_buffer_get_bounds (buffer, &start, &end);
+  gtk_text_buffer_delete (buffer, &start, &end);
+
+  /* Check buffer for emptiness (note that a single
+     empty line always remains in the buffer) */
+  n = gtk_text_buffer_get_line_count (buffer);
+  if (n != 1)
+    g_error ("%d lines, expected 1", n);
+
+  n = gtk_text_buffer_get_char_count (buffer);
+  if (n != 0)
+    g_error ("%d chars, expected 0", n);
+
+  run_tests (buffer);
+
+  g_object_unref (buffer);
+}
+
+static void
+test_tag (void)
+{
+  GtkTextBuffer *buffer;
+  GtkTextIter start, end;
+  
+  buffer = gtk_text_buffer_new (NULL);
+
+  fill_buffer (buffer);
+
+  gtk_text_buffer_set_text (buffer, "adcdef", -1);
+  gtk_text_buffer_get_iter_at_offset (buffer, &start, 1);
+  gtk_text_buffer_get_iter_at_offset (buffer, &end, 3);
+  gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &start, &end);
+  
+  run_tests (buffer);
+  
+  g_object_unref (buffer);
+}
+
+extern void pixbuf_init (void);
+
+int
+main (int argc, char** argv)
+{
+  /* First, we turn on btree debugging. */
+  gtk_debug_flags |= GTK_DEBUG_TEXT;
+
+  gtk_test_init (&argc, &argv);
+  pixbuf_init ();
+
+  g_test_add_func ("/TextBuffer/UTF8 unknown char", test_utf8);
+  g_test_add_func ("/TextBuffer/Line separator", test_line_separator);
+  g_test_add_func ("/TextBuffer/Logical motion", test_logical_motion);
+  g_test_add_func ("/TextBuffer/Marks", test_marks);
+  g_test_add_func ("/TextBuffer/Empty buffer", test_empty_buffer);
+  g_test_add_func ("/TextBuffer/Get and Set", test_get_set);
+  g_test_add_func ("/TextBuffer/Fill and Empty", test_fill_empty);
+  g_test_add_func ("/TextBuffer/Tag", test_tag);
+  
+  return g_test_run();
+}
index 00ec7328234d887cdb8536025dc9f2fc12c5190a..edd18b01daa272ae34b8c6c07c528fd943d6d292 100644 (file)
@@ -25,34 +25,6 @@ if USE_X11
 testsocket_programs = testsocket testsocket_child
 endif
 
-TEST_PROGS                     += floatingtest
-floatingtest_DEPENDENCIES       = $(TEST_DEPS)
-floatingtest_LDADD              = $(LDADDS)
-TEST_PROGS                      += objecttests
-objecttests_SOURCES              = objecttests.c pixbuf-init.c
-objecttests_LDADD                = $(LDADDS)
-objecttests_DEPENDENCIES         = $(TEST_DEPS)
-# this doesn't work in make distcheck, since it doesn't
-# find file-chooser-test-dir 
-# TEST_PROGS                      += autotestfilechooser
-autotestfilechooser_DEPENDENCIES = $(TEST_DEPS)
-autotestfilechooser_LDADD        = $(LDADDS)
-autotestfilechooser_SOURCES      = autotestfilechooser.c pixbuf-init.c
-TEST_PROGS                      += buildertest
-buildertest_DEPENDENCIES        = $(TEST_DEPS)
-buildertest_LDADD               = $(LDADDS)
-buildertest_LDFLAGS             = -export-dynamic
-if OS_UNIX
-TEST_PROGS                      += defaultvaluetest 
-endif
-defaultvaluetest_DEPENDENCIES   = $(TEST_DEPS)
-defaultvaluetest_LDADD                  = $(LDADDS)
-defaultvaluetest_SOURCES        = defaultvaluetest.c pixbuf-init.c     
-TEST_PROGS                      += textbuffertest
-textbuffertest_DEPENDENCIES     = $(TEST_DEPS)
-textbuffertest_LDADD            = $(LDADDS)
-textbuffertest_SOURCES           = textbuffertest.c pixbuf-init.c
-
 noinst_PROGRAMS =  $(TEST_PROGS)       \
        simple                          \
        print-editor                    \
diff --git a/tests/autotestfilechooser.c b/tests/autotestfilechooser.c
deleted file mode 100644 (file)
index 737e5fe..0000000
+++ /dev/null
@@ -1,1093 +0,0 @@
-/* GTK - The GIMP Toolkit
- * autotestfilechooser.c: Automated unit tests for the GtkFileChooser widget
- * Copyright (C) 2005, Novell, Inc.
- *
- * Authors:
- *   Federico Mena-Quintero <federico@novell.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/* TODO:
- *
- * - In test_reload_sequence(), test that the selection is preserved properly
- *   between unmap/map.
- *
- * - More tests!
- */
-
-#define GTK_FILE_SYSTEM_ENABLE_UNSUPPORTED
-#undef GTK_DISABLE_DEPRECATED
-#define SLEEP_DURATION  100
-
-#include <config.h>
-#include <string.h>
-#include <glib/gprintf.h>
-#include <gtk/gtk.h>
-#include "gtk/gtkfilechooserprivate.h"
-#include "gtk/gtkfilechooserdefault.h"
-#include "gtk/gtkfilechooserentry.h"
-
-static void
-log_test (gboolean passed, const char *test_name, ...)
-{
-  va_list args;
-  char *str;
-
-  va_start (args, test_name);
-  str = g_strdup_vprintf (test_name, args);
-  va_end (args);
-
-  if (g_test_verbose())
-    g_printf ("%s: %s\n", passed ? "PASSED" : "FAILED", str);
-  g_free (str);
-}
-
-typedef void (* SetFilenameFn) (GtkFileChooser *chooser, gpointer data);
-typedef gboolean (* CompareFilenameFn) (GtkFileChooser *chooser, gpointer data);
-
-struct test_set_filename_closure {
-  GtkWidget *chooser;
-  GtkWidget *accept_button;
-  gboolean focus_button;
-};
-
-static gboolean
-set_filename_timeout_cb (gpointer data)
-{
-  struct test_set_filename_closure *closure;
-
-  closure = data;
-
-  if (closure->focus_button)
-    gtk_widget_grab_focus (closure->accept_button);
-
-  gtk_button_clicked (GTK_BUTTON (closure->accept_button));
-
-  return FALSE;
-}
-
-
-static guint wait_for_idle_id = 0;
-
-static gboolean
-wait_for_idle_idle (gpointer data)
-{
-  wait_for_idle_id = 0;
-
-  return FALSE;
-}
-
-static void
-wait_for_idle (void)
-{
-  wait_for_idle_id = g_idle_add_full (G_PRIORITY_LOW + 100,
-                                     wait_for_idle_idle,
-                                     NULL, NULL);
-
-  while (wait_for_idle_id)
-    gtk_main_iteration ();
-}
-
-static gboolean
-test_set_filename (GtkFileChooserAction action,
-                  gboolean focus_button,
-                  SetFilenameFn set_filename_fn,const
-                  CompareFilenameFn compare_filename_fn,
-                  gpointer data)
-{
-  GtkWidget *chooser;
-  struct test_set_filename_closure closure;
-  gboolean retval;
-
-  chooser = gtk_file_chooser_dialog_new ("hello", NULL, action,
-                                        GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                        NULL);
-
-  closure.chooser = chooser;
-  closure.accept_button = gtk_dialog_add_button (GTK_DIALOG (chooser), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT);
-  closure.focus_button = focus_button;
-
-  gtk_dialog_set_default_response (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT);
-
-  (* set_filename_fn) (GTK_FILE_CHOOSER (chooser), data);
-
-  gdk_threads_add_timeout_full (G_MAXINT, SLEEP_DURATION, set_filename_timeout_cb, &closure, NULL);
-  gtk_dialog_run (GTK_DIALOG (chooser));
-
-  retval = (* compare_filename_fn) (GTK_FILE_CHOOSER (chooser), data);
-
-  gtk_widget_destroy (chooser);
-
-  return retval;
-}
-
-static void
-set_filename_cb (GtkFileChooser *chooser, gpointer data)
-{
-  const char *filename;
-
-  filename = data;
-  gtk_file_chooser_set_filename (chooser, filename);
-}
-
-static gboolean
-compare_filename_cb (GtkFileChooser *chooser, gpointer data)
-{
-  const char *filename;
-  char *out_filename;
-  gboolean retval;
-
-  filename = data;
-  out_filename = gtk_file_chooser_get_filename (chooser);
-
-  if (out_filename)
-    {
-      retval = (strcmp (out_filename, filename) == 0);
-      g_free (out_filename);
-    } else
-      retval = FALSE;
-
-  return retval;
-}
-
-static gboolean
-test_black_box_set_filename (GtkFileChooserAction action, const char *filename, gboolean focus_button)
-{
-  gboolean passed;
-
-  passed = test_set_filename (action, focus_button, set_filename_cb, compare_filename_cb, (char *) filename);
-
-  log_test (passed, "set_filename: action %d, focus_button=%s",
-           (int) action,
-           focus_button ? "TRUE" : "FALSE");
-
-  return passed;
-
-}
-
-struct current_name_closure {
-       const char *path;
-       const char *current_name;
-};
-
-static void
-set_current_name_cb (GtkFileChooser *chooser, gpointer data)
-{
-  struct current_name_closure *closure;
-
-  closure = data;
-
-  gtk_file_chooser_set_current_folder (chooser, closure->path);
-  gtk_file_chooser_set_current_name (chooser, closure->current_name);
-}
-
-static gboolean
-compare_current_name_cb (GtkFileChooser *chooser, gpointer data)
-{
-  struct current_name_closure *closure;
-  char *out_filename;
-  gboolean retval;
-
-  closure = data;
-
-  out_filename = gtk_file_chooser_get_filename (chooser);
-
-  if (out_filename)
-    {
-      char *filename;
-
-      filename = g_build_filename (closure->path, closure->current_name, NULL);
-      retval = (strcmp (filename, out_filename) == 0);
-      g_free (filename);
-      g_free (out_filename);
-    } else
-      retval = FALSE;
-
-  return retval;
-}
-
-static gboolean
-test_black_box_set_current_name (GtkFileChooserAction action, const char *path, const char *current_name, gboolean focus_button)
-{
-  struct current_name_closure closure;
-  gboolean passed;
-
-  closure.path = path;
-  closure.current_name = current_name;
-
-  passed = test_set_filename (action, focus_button,
-                             set_current_name_cb, compare_current_name_cb, &closure);
-
-  log_test (passed, "set_current_name, focus_button=%s", focus_button ? "TRUE" : "FALSE");
-
-  return passed;
-}
-
-/* FIXME: fails in CREATE_FOLDER mode when FOLDER_NAME == "/" */
-
-#if 0
-#define FILE_NAME "/nonexistent"
-#define FOLDER_NAME "/etc"
-#else
-#define FILE_NAME "/etc/passwd"
-#define FOLDER_NAME "/etc"
-#endif
-
-#define CURRENT_NAME "parangaricutirimicuaro.txt"
-#define CURRENT_NAME_FOLDER "parangaricutirimicuaro"
-
-/* https://bugzilla.novell.com/show_bug.cgi?id=184875
- * http://bugzilla.gnome.org/show_bug.cgi?id=347066
- * http://bugzilla.gnome.org/show_bug.cgi?id=346058
- */
-static void
-test_black_box (void)
-{
-  gboolean passed;
-  char *cwd;
-
-  passed = TRUE;
-
-  passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_OPEN, FILE_NAME, FALSE);
-  g_assert (passed);
-  passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_OPEN, FILE_NAME, TRUE);
-  g_assert (passed);
-  passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SAVE, FILE_NAME, FALSE);
-  g_assert (passed);
-  passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SAVE, FILE_NAME, TRUE);
-  g_assert (passed);
-  passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, FOLDER_NAME, FALSE);
-  g_assert (passed);
-  passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, FOLDER_NAME, TRUE);
-  g_assert (passed);
-  passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, FOLDER_NAME, FALSE);
-  g_assert (passed);
-  passed = passed && test_black_box_set_filename (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, FOLDER_NAME, TRUE);
-  g_assert (passed);
-
-  cwd = g_get_current_dir ();
-
-  passed = passed && test_black_box_set_current_name (GTK_FILE_CHOOSER_ACTION_SAVE, cwd, CURRENT_NAME, FALSE);
-  g_assert (passed);
-  passed = passed && test_black_box_set_current_name (GTK_FILE_CHOOSER_ACTION_SAVE, cwd, CURRENT_NAME, TRUE);
-  g_assert (passed);
-  passed = passed && test_black_box_set_current_name (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, cwd, CURRENT_NAME_FOLDER, FALSE);
-  g_assert (passed);
-  passed = passed && test_black_box_set_current_name (GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER, cwd, CURRENT_NAME_FOLDER, TRUE);
-  g_assert (passed);
-
-  g_free (cwd);
-
-  log_test (passed, "Black box tests");
-}
-
-struct confirm_overwrite_closure {
-  GtkWidget *chooser;
-  GtkWidget *accept_button;
-  gint confirm_overwrite_signal_emitted;
-  gchar *extension;
-};
-
-static GtkFileChooserConfirmation
-confirm_overwrite_cb (GtkFileChooser *chooser, gpointer data)
-{
-  struct confirm_overwrite_closure *closure = data;
-
-  if (g_test_verbose())
-    printf ("bling!\n");
-  closure->confirm_overwrite_signal_emitted += 1;
-
-  return GTK_FILE_CHOOSER_CONFIRMATION_ACCEPT_FILENAME;
-}
-
-static void
-overwrite_response_cb (GtkFileChooser *chooser, gint response, gpointer data)
-{
-  struct confirm_overwrite_closure *closure = data;
-  char *filename;
-
-  if (g_test_verbose())
-    printf ("plong!\n");
-
-  if (response != GTK_RESPONSE_ACCEPT)
-    return;
-
-  filename = gtk_file_chooser_get_filename (chooser);
-
-  if (!g_str_has_suffix (filename, closure->extension))
-    {
-      char *basename;
-
-      basename = g_path_get_basename (filename);
-      g_free (filename);
-
-      filename = g_strconcat (basename, closure->extension, NULL);
-      gtk_file_chooser_set_current_name (chooser, filename);
-
-      g_signal_stop_emission_by_name (chooser, "response");
-      gtk_dialog_response (GTK_DIALOG (chooser), GTK_RESPONSE_ACCEPT);
-    }
-}
-
-static gboolean
-confirm_overwrite_timeout_cb (gpointer data)
-{
-  struct confirm_overwrite_closure *closure;
-
-  closure = data;
-  gtk_button_clicked (GTK_BUTTON (closure->accept_button));
-
-  return FALSE;
-}
-
-/* http://bugzilla.gnome.org/show_bug.cgi?id=347883 */
-static gboolean
-test_confirm_overwrite_for_path (const char *path, gboolean append_extension)
-{
-  gboolean passed;
-  struct confirm_overwrite_closure closure;
-  char *filename;
-
-  passed = TRUE;
-
-  closure.extension = NULL;
-  closure.confirm_overwrite_signal_emitted = 0;
-  closure.chooser = gtk_file_chooser_dialog_new ("hello", NULL, GTK_FILE_CHOOSER_ACTION_SAVE,
-                                                GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                                NULL);
-  closure.accept_button = gtk_dialog_add_button (GTK_DIALOG (closure.chooser),
-                                                 GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT);
-  gtk_dialog_set_default_response (GTK_DIALOG (closure.chooser), GTK_RESPONSE_ACCEPT);
-
-  gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (closure.chooser), TRUE);
-
-  g_signal_connect (closure.chooser, "confirm-overwrite",
-                   G_CALLBACK (confirm_overwrite_cb), &closure);
-
-  if (append_extension)
-    {
-      char *extension;
-
-      filename = g_path_get_dirname (path);
-      gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (closure.chooser), filename);
-      g_free (filename);
-
-      filename = g_path_get_basename (path);
-      extension = strchr (filename, '.');
-
-      if (extension)
-        {
-          closure.extension = g_strdup (extension);
-          *extension = '\0';
-        }
-
-      gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (closure.chooser), filename);
-      g_free (filename);
-
-      g_signal_connect (closure.chooser, "response",
-                        G_CALLBACK (overwrite_response_cb), &closure);
-    }
-  else
-    {
-      gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (closure.chooser), path);
-    }
-
-  gdk_threads_add_timeout_full (G_MAXINT, SLEEP_DURATION, confirm_overwrite_timeout_cb, &closure, NULL);
-  gtk_dialog_run (GTK_DIALOG (closure.chooser));
-
-  filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (closure.chooser));
-  passed = passed && filename && (strcmp (filename, path) == 0);
-  g_free (filename);
-  
-  gtk_widget_destroy (closure.chooser);
-
-  passed = passed && (1 == closure.confirm_overwrite_signal_emitted);
-
-  log_test (passed, "Confirm overwrite for %s", path);
-
-  return passed;
-}
-
-static void
-test_confirm_overwrite (void)
-{
-  gboolean passed = TRUE;
-
-  /* first test for a file we know will always exist */
-  passed = passed && test_confirm_overwrite_for_path ("/etc/passwd", FALSE); 
-  g_assert (passed);
-  passed = passed && test_confirm_overwrite_for_path ("/etc/resolv.conf", TRUE); 
-  g_assert (passed);
-}
-
-static const GtkFileChooserAction open_actions[] = {
-  GTK_FILE_CHOOSER_ACTION_OPEN,
-  GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
-};
-
-static const GtkFileChooserAction save_actions[] = {
-  GTK_FILE_CHOOSER_ACTION_SAVE,
-  GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER
-};
-
-
-static gboolean
-has_action (const GtkFileChooserAction *actions,
-           int n_actions,
-           GtkFileChooserAction sought_action)
-{
-  int i;
-
-  for (i = 0; i < n_actions; i++)
-    if (actions[i] == sought_action)
-      return TRUE;
-
-  return FALSE;
-}
-
-static const char *
-get_action_name (GtkFileChooserAction action)
-{
-  GEnumClass *enum_class;
-  GEnumValue *enum_value;
-
-  enum_class = g_type_class_peek (GTK_TYPE_FILE_CHOOSER_ACTION);
-  if (!enum_class)
-    g_error ("BUG: get_action_name(): no GEnumClass for GTK_TYPE_FILE_CHOOSER_ACTION");
-
-  enum_value = g_enum_get_value (enum_class, (int) action);
-  if (!enum_value)
-    g_error ("BUG: get_action_name(): no GEnumValue for GtkFileChooserAction %d", (int) action);
-
-  return enum_value->value_name;
-}
-
-static GtkFileChooserDefault *
-get_impl_from_dialog (GtkWidget *dialog)
-{
-  GtkFileChooserDialog *d;
-  GtkFileChooserDialogPrivate *dialog_priv;
-  GtkFileChooserWidget *chooser_widget;
-  GtkFileChooserWidgetPrivate *widget_priv;
-  GtkFileChooserDefault *impl;
-
-  d = GTK_FILE_CHOOSER_DIALOG (dialog);
-  dialog_priv = d->priv;
-  chooser_widget = GTK_FILE_CHOOSER_WIDGET (dialog_priv->widget);
-  if (!chooser_widget)
-    g_error ("BUG: dialog_priv->widget is not a GtkFileChooserWidget");
-
-  widget_priv = chooser_widget->priv;
-  impl = (GtkFileChooserDefault *) (widget_priv->impl);
-  if (!impl)
-    g_error ("BUG: widget_priv->impl is not a GtkFileChooserDefault");
-
-  return impl;
-}
-
-static gboolean
-test_widgets_for_current_action (GtkFileChooserDialog *dialog,
-                                GtkFileChooserAction  expected_action)
-{
-  GtkFileChooserDefault *impl;
-  gboolean passed;
-
-  if (gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog)) != expected_action)
-    return FALSE;
-
-  impl = get_impl_from_dialog (GTK_WIDGET (dialog));
-
-  g_assert (impl->action == expected_action);
-
-  passed = TRUE;
-
-  /* OPEN implies that the "new folder" button is hidden; otherwise it is shown */
-  if (impl->action == GTK_FILE_CHOOSER_ACTION_OPEN)
-    passed = passed && !GTK_WIDGET_VISIBLE (impl->browse_new_folder_button);
-  else
-    passed = passed && GTK_WIDGET_VISIBLE (impl->browse_new_folder_button);
-
-  /* Check that the widgets are present/visible or not */
-  if (has_action (open_actions, G_N_ELEMENTS (open_actions), impl->action))
-    {
-      passed = passed && (impl->save_widgets == NULL
-                         && (impl->location_mode == LOCATION_MODE_PATH_BAR
-                             ? impl->location_entry == NULL
-                             : impl->location_entry != NULL)
-                         && impl->save_folder_label == NULL
-                         && impl->save_folder_combo == NULL
-                         && impl->save_expander == NULL
-                         && GTK_IS_CONTAINER (impl->browse_widgets) && GTK_WIDGET_DRAWABLE (impl->browse_widgets));
-    }
-  else if (has_action (save_actions, G_N_ELEMENTS (save_actions), impl->action))
-    {
-      /* FIXME: we can't use GTK_IS_FILE_CHOOSER_ENTRY() because it uses
-       * _gtk_file_chooser_entry_get_type(), which is a non-exported symbol.
-       * So, we just test impl->location_entry for being non-NULL
-       */
-      passed = passed && (GTK_IS_CONTAINER (impl->save_widgets) && GTK_WIDGET_DRAWABLE (impl->save_widgets)
-                         && impl->location_entry != NULL && GTK_WIDGET_DRAWABLE (impl->location_entry)
-                         && GTK_IS_LABEL (impl->save_folder_label) && GTK_WIDGET_DRAWABLE (impl->save_folder_label)
-                         && GTK_IS_COMBO_BOX (impl->save_folder_combo) && GTK_WIDGET_DRAWABLE (impl->save_folder_combo)
-                         && GTK_IS_EXPANDER (impl->save_expander) && GTK_WIDGET_DRAWABLE (impl->save_expander)
-                         && GTK_IS_CONTAINER (impl->browse_widgets));
-
-      /* FIXME: we are in a SAVE mode; test the visibility and sensitivity of
-       * the children that change depending on the state of the expander.
-       */
-    }
-  else
-    {
-      g_error ("BAD TEST: test_widgets_for_current_action() doesn't know about %s", get_action_name (impl->action));
-      passed = FALSE;
-    }
-
-  return passed;
-}
-
-typedef gboolean (* ForeachActionCallback) (GtkFileChooserDialog *dialog,
-                                           GtkFileChooserAction  action,
-                                           gpointer              user_data);
-
-static gboolean
-foreach_action (GtkFileChooserDialog *dialog,
-               ForeachActionCallback callback,
-               gpointer              user_data)
-{
-  GEnumClass *enum_class;
-  int i;
-
-  enum_class = g_type_class_peek (GTK_TYPE_FILE_CHOOSER_ACTION);
-  if (!enum_class)
-    g_error ("BUG: get_action_name(): no GEnumClass for GTK_TYPE_FILE_CHOOSER_ACTION");
-
-  for (i = 0; i < enum_class->n_values; i++)
-    {
-      GEnumValue *enum_value;
-      GtkFileChooserAction action;
-      gboolean passed;
-
-      enum_value = enum_class->values + i;
-      action = enum_value->value;
-
-      passed = (* callback) (dialog, action, user_data);
-      if (!passed)
-       return FALSE;
-    }
-
-  return TRUE;
-}
-
-struct action_closure {
-  GtkFileChooserAction from_action;
-};
-
-static gboolean
-switch_from_to_action_cb (GtkFileChooserDialog *dialog,
-                         GtkFileChooserAction  action,
-                         gpointer              user_data)
-{
-  struct action_closure *closure;
-  gboolean passed;
-
-  closure = user_data;
-
-  gtk_file_chooser_set_action (GTK_FILE_CHOOSER (dialog), closure->from_action);
-
-  passed = test_widgets_for_current_action (dialog, closure->from_action);
-  log_test (passed, "switch_from_to_action_cb(): reset to action %s", get_action_name (closure->from_action));
-  if (!passed)
-    return FALSE;
-
-  gtk_file_chooser_set_action (GTK_FILE_CHOOSER (dialog), action);
-
-  passed = test_widgets_for_current_action (dialog, action);
-  log_test (passed, "switch_from_to_action_cb(): transition from %s to %s",
-           get_action_name (closure->from_action),
-           get_action_name (action));
-  return passed;
-}
-
-static gboolean
-switch_from_action_cb (GtkFileChooserDialog *dialog,
-                      GtkFileChooserAction  action,
-                      gpointer              user_data)
-{
-  struct action_closure closure;
-
-  closure.from_action = action;
-
-  return foreach_action (dialog, switch_from_to_action_cb, &closure);
-}
-
-static void
-test_action_widgets (void)
-{
-  GtkWidget *dialog;
-  GtkFileChooserAction action;
-  gboolean passed;
-
-  dialog = gtk_file_chooser_dialog_new ("Test file chooser",
-                                       NULL,
-                                       GTK_FILE_CHOOSER_ACTION_OPEN,
-                                       GTK_STOCK_CANCEL,
-                                       GTK_RESPONSE_CANCEL,
-                                       GTK_STOCK_OK,
-                                       GTK_RESPONSE_ACCEPT,
-                                       NULL);
-  gtk_widget_show_now (dialog);
-
-  action = gtk_file_chooser_get_action (GTK_FILE_CHOOSER (dialog));
-
-  passed = test_widgets_for_current_action (GTK_FILE_CHOOSER_DIALOG (dialog), action);
-  log_test (passed, "test_action_widgets(): widgets for initial action %s", get_action_name (action));
-  g_assert (passed);
-
-  passed = foreach_action (GTK_FILE_CHOOSER_DIALOG (dialog), switch_from_action_cb, NULL);
-  log_test (passed, "test_action_widgets(): all transitions through property change");
-  g_assert (passed);
-
-  gtk_widget_destroy (dialog);
-}
-
-static gboolean
-test_reload_sequence (gboolean set_folder_before_map)
-{
-  GtkWidget *dialog;
-  GtkFileChooserDefault *impl;
-  gboolean passed;
-  char *folder;
-  char *current_working_dir;
-
-  passed = TRUE;
-
-  current_working_dir = g_get_current_dir ();
-
-  dialog = gtk_file_chooser_dialog_new ("Test file chooser",
-                                       NULL,
-                                       GTK_FILE_CHOOSER_ACTION_OPEN,
-                                       GTK_STOCK_CANCEL,
-                                       GTK_RESPONSE_CANCEL,
-                                       GTK_STOCK_OK,
-                                       GTK_RESPONSE_ACCEPT,
-                                       NULL);
-  impl = get_impl_from_dialog (dialog);
-
-  if (set_folder_before_map)
-    {
-      gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), g_get_home_dir ());
-
-      wait_for_idle ();
-
-      passed = passed && (impl->current_folder != NULL
-                         && impl->browse_files_model != NULL
-                         && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
-                         && impl->reload_state == RELOAD_HAS_FOLDER
-                         && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
-                         && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
-                             ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
-                             : TRUE));
-
-      wait_for_idle ();
-
-      folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
-      passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
-      g_free (folder);
-    }
-  else
-    {
-      /* Initially, no folder is not loaded or pending */
-      passed = passed && (impl->current_folder == NULL
-                         && impl->sort_model == NULL
-                         && impl->browse_files_model == NULL
-                         && impl->load_state == LOAD_EMPTY
-                         && impl->reload_state == RELOAD_EMPTY
-                         && impl->load_timeout_id == 0);
-
-      wait_for_idle ();
-
-      folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
-      passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
-    }
-
-  log_test (passed, "test_reload_sequence(): initial status");
-
-  /* After mapping, it is loading some folder, either the one that was explicitly set or the default one */
-
-  gtk_widget_show_now (dialog);
-
-  wait_for_idle ();
-
-  passed = passed && (impl->current_folder != NULL
-                     && impl->browse_files_model != NULL
-                     && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
-                     && impl->reload_state == RELOAD_HAS_FOLDER
-                     && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
-                     && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
-                         ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
-                         : TRUE));
-
-  folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
-  if (set_folder_before_map)
-    passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
-  else
-    passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
-
-  g_free (folder);
-
-  log_test (passed, "test_reload_sequence(): status after map");
-
-  /* Unmap it; we should still have a folder */
-
-  gtk_widget_hide (dialog);
-
-  wait_for_idle ();
-
-  passed = passed && (impl->current_folder != NULL
-                     && impl->browse_files_model != NULL
-                     && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
-                     && impl->reload_state == RELOAD_WAS_UNMAPPED
-                     && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
-                     && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
-                         ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
-                         : TRUE));
-
-  folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
-  if (set_folder_before_map)
-    passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
-  else
-    passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
-
-  g_free (folder);
-
-  log_test (passed, "test_reload_sequence(): status after unmap");
-
-  /* Map it again! */
-
-  gtk_widget_show_now (dialog);
-
-  wait_for_idle ();
-
-  passed = passed && (impl->current_folder != NULL
-                     && impl->browse_files_model != NULL
-                     && (impl->load_state == LOAD_PRELOAD || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
-                     && impl->reload_state == RELOAD_HAS_FOLDER
-                     && (impl->load_state == LOAD_PRELOAD ? (impl->load_timeout_id != 0) : TRUE)
-                     && ((impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED)
-                         ? (impl->load_timeout_id == 0 && impl->sort_model != NULL)
-                         : TRUE));
-
-  folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (dialog));
-  if (set_folder_before_map)
-    passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
-  else
-    passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
-
-  g_free (folder);
-
-  log_test (passed, "test_reload_sequence(): status after re-map");
-
-  gtk_widget_destroy (dialog);
-  g_free (current_working_dir);
-
-  return passed;
-}
-
-static void
-test_reload (void)
-{
-  gboolean passed;
-
-  passed = test_reload_sequence (FALSE);
-  log_test (passed, "test_reload(): create and use the default folder");
-  g_assert (passed);
-
-  passed = test_reload_sequence (TRUE);
-  log_test (passed, "test_reload(): set a folder explicitly before mapping");
-  g_assert (passed);
-}
-
-static gboolean
-test_button_folder_states_for_action (GtkFileChooserAction action, gboolean use_dialog, gboolean set_folder_on_dialog)
-{
-  gboolean passed;
-  GtkWidget *window;
-  GtkWidget *button;
-  char *folder;
-  GtkWidget *dialog;
-  char *current_working_dir;
-  gboolean must_have_cwd;
-
-  passed = TRUE;
-
-  current_working_dir = g_get_current_dir ();
-  must_have_cwd = !(use_dialog && set_folder_on_dialog);
-
-  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-
-  if (use_dialog)
-    {
-      dialog = gtk_file_chooser_dialog_new ("Test", NULL, action,
-                                           GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                           GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
-                                           NULL);
-      button = gtk_file_chooser_button_new_with_dialog (dialog);
-
-      if (set_folder_on_dialog)
-       gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), g_get_home_dir ());
-    }
-  else
-    {
-      button = gtk_file_chooser_button_new ("Test", action);
-      dialog = NULL; /* keep gcc happy */
-    }
-
-  gtk_container_add (GTK_CONTAINER (window), button);
-
-  /* Pre-map; no folder is set */
-  wait_for_idle ();
-
-  folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
-  if (must_have_cwd)
-    passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
-  else
-    passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
-
-  log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, pre-map, %s",
-           get_action_name (action),
-           use_dialog,
-           set_folder_on_dialog,
-           must_have_cwd ? "must have $cwd" : "must have explicit folder");
-
-  /* Map; folder should be set */
-
-  gtk_widget_show_all (window);
-  gtk_widget_show_now (window);
-
-  wait_for_idle ();
-
-  folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
-
-  if (must_have_cwd)
-    passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
-  else
-    passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
-
-  log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, mapped, %s",
-           get_action_name (action),
-           use_dialog,
-           set_folder_on_dialog,
-           must_have_cwd ? "must have $cwd" : "must have explicit folder");
-  g_free (folder);
-
-  /* Unmap; folder should be set */
-
-  gtk_widget_hide (window);
-  wait_for_idle ();
-  folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
-
-  if (must_have_cwd)
-    passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
-  else
-    passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
-
-  log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, unmapped, %s",
-           get_action_name (action),
-           use_dialog,
-           set_folder_on_dialog,
-           must_have_cwd ? "must have $cwd" : "must have explicit folder");
-  g_free (folder);
-
-  /* Re-map; folder should be set */
-
-  gtk_widget_show_now (window);
-  folder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (button));
-
-  if (must_have_cwd)
-    passed = passed && (folder != NULL && strcmp (folder, current_working_dir) == 0);
-  else
-    passed = passed && (folder != NULL && strcmp (folder, g_get_home_dir()) == 0);
-  wait_for_idle ();
-  log_test (passed, "test_button_folder_states_for_action(): %s, use_dialog=%d, set_folder_on_dialog=%d, re-mapped, %s",
-           get_action_name (action),
-           use_dialog,
-           set_folder_on_dialog,
-           must_have_cwd ? "must have $cwd" : "must have explicit folder");
-  g_free (folder);
-
-  g_free (current_working_dir);
-
-  gtk_widget_destroy (window);
-
-  return passed;
-}
-
-static void
-test_button_folder_states (void)
-{
-  /* GtkFileChooserButton only supports OPEN and SELECT_FOLDER */
-  static const GtkFileChooserAction actions_to_test[] = {
-    GTK_FILE_CHOOSER_ACTION_OPEN,
-    GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
-  };
-  gboolean passed;
-  int i;
-
-  passed = TRUE;
-
-  for (i = 0; i < G_N_ELEMENTS (actions_to_test); i++)
-    {
-      passed = passed && test_button_folder_states_for_action (actions_to_test[i], FALSE, FALSE);
-      g_assert (passed);
-      passed = passed && test_button_folder_states_for_action (actions_to_test[i], TRUE, FALSE);
-      g_assert (passed);
-      passed = passed && test_button_folder_states_for_action (actions_to_test[i], TRUE, TRUE);
-      g_assert (passed);
-      log_test (passed, "test_button_folder_states(): action %s", get_action_name (actions_to_test[i]));
-    }
-
-  log_test (passed, "test_button_folder_states(): all supported actions");
-}
-
-static gboolean
-sleep_timeout_cb (gpointer data)
-{
-  gtk_main_quit ();
-  return FALSE;
-}
-
-static void
-sleep_in_main_loop (double fraction)
-{
-  /* process all pending idles and events */
-  while (g_main_context_pending (NULL))
-    g_main_context_iteration (NULL, FALSE);
-  /* sleeping probably isn't strictly necessary here */
-  gdk_threads_add_timeout_full (G_MAXINT, fraction * SLEEP_DURATION, sleep_timeout_cb, NULL, NULL);
-  gtk_main ();
-  /* process any pending idles or events that arrived during sleep */
-  while (g_main_context_pending (NULL))
-    g_main_context_iteration (NULL, FALSE);
-}
-
-static void
-test_folder_switch_and_filters (void)
-{
-  gboolean passed;
-  char *cwd;
-  char *base_dir;
-  GtkFilePath *cwd_path;
-  GtkFilePath *base_dir_path;
-  GtkWidget *dialog;
-  GtkFileFilter *all_filter;
-  GtkFileFilter *txt_filter;
-  GtkFileChooserDefault *impl;
-
-  passed = TRUE;
-
-  cwd = g_get_current_dir ();
-  base_dir = g_build_filename (cwd, "file-chooser-test-dir", NULL);
-
-  dialog = gtk_file_chooser_dialog_new ("Test", NULL, GTK_FILE_CHOOSER_ACTION_OPEN,
-                                       GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                       GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
-                                       NULL);
-  impl = get_impl_from_dialog (dialog);
-
-  cwd_path = gtk_file_system_filename_to_path (impl->file_system, cwd);
-  base_dir_path = gtk_file_system_filename_to_path (impl->file_system, base_dir);
-
-  passed = passed && gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), base_dir);
-  g_assert (passed);
-
-  /* All files filter */
-
-  all_filter = gtk_file_filter_new ();
-  gtk_file_filter_set_name (all_filter, "All files");
-  gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), all_filter);
-
-  /* *.txt filter */
-
-  txt_filter = gtk_file_filter_new ();
-  gtk_file_filter_set_name (all_filter, "*.txt");
-  gtk_file_filter_add_pattern (txt_filter, "*.txt");
-  gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), txt_filter);
-
-  /* Test filter set */
-
-  gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), all_filter);
-  passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == all_filter);
-  g_assert (passed);
-
-  gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), txt_filter);
-  passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
-  log_test (passed, "test_folder_switch_and_filters(): set and get filter");
-  g_assert (passed);
-
-  gtk_widget_show (dialog);
-
-  /* Test that filter is unchanged when we switch folders */
-
-  gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), cwd);
-  sleep_in_main_loop (0.5);
-  passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
-  g_assert (passed);
-
-  gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), base_dir);
-  sleep_in_main_loop (0.25);
-
-  g_signal_emit_by_name (impl->browse_path_bar, "path-clicked",
-                        (GtkFilePath *) cwd_path,
-                        (GtkFilePath *) base_dir_path,
-                        FALSE);
-  sleep_in_main_loop (0.25);
-  passed = passed && (gtk_file_chooser_get_filter (GTK_FILE_CHOOSER (dialog)) == txt_filter);
-  log_test (passed, "test_folder_switch_and_filters(): filter after changing folder");
-  g_assert (passed);
-
-  /* cleanups */
-  g_free (cwd);
-  g_free (base_dir);
-  gtk_file_path_free (cwd_path);
-  gtk_file_path_free (base_dir_path);
-
-  gtk_widget_destroy (dialog);
-
-  log_test (passed, "test_folder_switch_and_filters(): all filter tests");
-}
-
-extern void pixbuf_init (void);
-
-int
-main (int    argc,
-      char **argv)
-{
-  pixbuf_init ();
-  /* initialize test program */
-  gtk_test_init (&argc, &argv);
-
-  /* register tests */
-  g_test_add_func ("/GtkFileChooser/black_box", test_black_box);
-  g_test_add_func ("/GtkFileChooser/confirm_overwrite", test_confirm_overwrite);
-  g_test_add_func ("/GtkFileChooser/action_widgets", test_action_widgets);
-  g_test_add_func ("/GtkFileChooser/reload", test_reload);
-  g_test_add_func ("/GtkFileChooser/button_folder_states", test_button_folder_states);
-  g_test_add_func ("/GtkFileChooser/folder_switch_and_filters", test_folder_switch_and_filters);
-
-  /* run and check selected tests */
-  return g_test_run();
-}
diff --git a/tests/buildertest.c b/tests/buildertest.c
deleted file mode 100644 (file)
index de4e080..0000000
+++ /dev/null
@@ -1,2213 +0,0 @@
-/* buildertest.c
- * Copyright (C) 2006-2007 Async Open Source
- * Authors: Johan Dahlin
- *          Henrique Romano
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <string.h>
-#include <libintl.h>
-#include <locale.h>
-#include <math.h>
-
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-
-/* Copied from gtkiconfactory.c; keep in sync! */
-struct _GtkIconSet
-{
-  guint ref_count;
-  GSList *sources;
-  GSList *cache;
-  guint cache_size;
-  guint cache_serial;
-};
-
-
-static GtkBuilder *
-builder_new_from_string (const gchar *buffer,
-                         gsize length,
-                         gchar *domain)
-{
-  GtkBuilder *builder;
-  builder = gtk_builder_new ();
-  if (domain)
-    gtk_builder_set_translation_domain (builder, domain);
-  gtk_builder_add_from_string (builder, buffer, length, NULL);
-  return builder;
-}
-
-static void
-test_parser (void)
-{
-  GtkBuilder *builder;
-  GError *error;
-  
-  builder = gtk_builder_new ();
-
-  error = NULL;
-  gtk_builder_add_from_string (builder, "<xxx/>", -1, &error);
-  g_assert (error != NULL);
-  g_assert (error->domain == GTK_BUILDER_ERROR);
-  g_assert (error->code == GTK_BUILDER_ERROR_UNHANDLED_TAG);
-    g_error_free (error);
-  
-  error = NULL;
-  gtk_builder_add_from_string (builder, "<interface invalid=\"X\"/>", -1, &error);
-  g_assert (error != NULL);
-  g_assert (error->domain == GTK_BUILDER_ERROR);
-  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_ATTRIBUTE);
-  g_error_free (error);
-
-  error = NULL;
-  gtk_builder_add_from_string (builder, "<interface><child/></interface>", -1, &error);
-  g_assert (error != NULL);
-  g_assert (error->domain == GTK_BUILDER_ERROR);
-  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_TAG);
-  g_error_free (error);
-
-  error = NULL;
-  gtk_builder_add_from_string (builder, "<interface><object class=\"GtkVBox\" id=\"a\"><object class=\"GtkHBox\" id=\"b\"/></object></interface>", -1, &error);
-  g_assert (error != NULL);
-  g_assert (error->domain == GTK_BUILDER_ERROR);
-  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_TAG);
-  g_error_free (error);
-
-  error = NULL;
-  gtk_builder_add_from_string (builder, "<interface><object class=\"Unknown\" id=\"a\"></object></interface>", -1, &error);
-  g_assert (error != NULL);
-  g_assert (error->domain == GTK_BUILDER_ERROR);
-  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
-  g_error_free (error);
-
-  error = NULL;
-  gtk_builder_add_from_string (builder, "<interface><object class=\"GtkWidget\" id=\"a\" constructor=\"none\"></object></interface>", -1, &error);
-  g_assert (error != NULL);
-  g_assert (error->domain == GTK_BUILDER_ERROR);
-  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
-  g_error_free (error);
-
-  error = NULL;
-  gtk_builder_add_from_string (builder, "<interface><object class=\"GtkButton\" id=\"a\"><child internal-child=\"foobar\"><object class=\"GtkButton\" id=\"int\"/></child></object></interface>", -1, &error);
-  g_assert (error != NULL);
-  g_assert (error->domain == GTK_BUILDER_ERROR);
-  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
-  g_error_free (error);
-
-  g_object_unref (builder);
-}
-
-static int normal = 0;
-static int after = 0;
-static int object = 0;
-static int object_after = 0;
-
-void // exported for GtkBuilder
-signal_normal (GtkWindow *window, GParamSpec spec)
-{
-  g_assert (GTK_IS_WINDOW (window));
-  g_assert (normal == 0);
-  g_assert (after == 0);
-
-  normal++;
-}
-
-void // exported for GtkBuilder
-signal_after (GtkWindow *window, GParamSpec spec)
-{
-  g_assert (GTK_IS_WINDOW (window));
-  g_assert (normal == 1);
-  g_assert (after == 0);
-  
-  after++;
-}
-
-void // exported for GtkBuilder
-signal_object (GtkButton *button, GParamSpec spec)
-{
-  g_assert (GTK_IS_BUTTON (button));
-  g_assert (object == 0);
-  g_assert (object_after == 0);
-
-  object++;
-}
-
-void // exported for GtkBuilder
-signal_object_after (GtkButton *button, GParamSpec spec)
-{
-  g_assert (GTK_IS_BUTTON (button));
-  g_assert (object == 1);
-  g_assert (object_after == 0);
-
-  object_after++;
-}
-
-void // exported for GtkBuilder
-signal_first (GtkButton *button, GParamSpec spec)
-{
-  g_assert (normal == 0);
-  normal = 10;
-}
-
-void // exported for GtkBuilder
-signal_second (GtkButton *button, GParamSpec spec)
-{
-  g_assert (normal == 10);
-  normal = 20;
-}
-
-void // exported for GtkBuilder
-signal_extra (GtkButton *button, GParamSpec spec)
-{
-  g_assert (normal == 20);
-  normal = 30;
-}
-
-void // exported for GtkBuilder
-signal_extra2 (GtkButton *button, GParamSpec spec)
-{
-  g_assert (normal == 30);
-  normal = 40;
-}
-
-static void
-test_connect_signals (void)
-{
-  GtkBuilder *builder;
-  GObject *window;
-  const gchar buffer[] =
-    "<interface>"
-    "  <object class=\"GtkButton\" id=\"button\"/>"
-    "  <object class=\"GtkWindow\" id=\"window1\">"
-    "    <signal name=\"notify::title\" handler=\"signal_normal\"/>"
-    "    <signal name=\"notify::title\" handler=\"signal_after\" after=\"yes\"/>"
-    "    <signal name=\"notify::title\" handler=\"signal_object\""
-    "            object=\"button\"/>"
-    "    <signal name=\"notify::title\" handler=\"signal_object_after\""
-    "            object=\"button\" after=\"yes\"/>"
-    "  </object>"
-    "</interface>";
-  const gchar buffer_order[] =
-    "<interface>"
-    "  <object class=\"GtkWindow\" id=\"window1\">"
-    "    <signal name=\"notify::title\" handler=\"signal_first\"/>"
-    "    <signal name=\"notify::title\" handler=\"signal_second\"/>"
-    "  </object>"
-    "</interface>";
-  const gchar buffer_extra[] =
-    "<interface>"
-    "  <object class=\"GtkWindow\" id=\"window2\">"
-    "    <signal name=\"notify::title\" handler=\"signal_extra\"/>"
-    "  </object>"
-    "</interface>";
-  const gchar buffer_extra2[] =
-    "<interface>"
-    "  <object class=\"GtkWindow\" id=\"window3\">"
-    "    <signal name=\"notify::title\" handler=\"signal_extra2\"/>"
-    "  </object>"
-    "</interface>";
-  const gchar buffer_after_child[] =
-    "<interface>"
-    "  <object class=\"GtkWindow\" id=\"window1\">"
-    "    <child>"
-    "      <object class=\"GtkButton\" id=\"button1\"/>"
-    "    </child>"
-    "    <signal name=\"notify::title\" handler=\"signal_normal\"/>"
-    "  </object>"
-    "</interface>";
-
-  builder = builder_new_from_string (buffer, -1, NULL);
-  gtk_builder_connect_signals (builder, NULL);
-
-  window = gtk_builder_get_object (builder, "window1");
-  gtk_window_set_title (GTK_WINDOW (window), "test");
-
-  g_assert_cmpint (normal, ==, 1);
-  g_assert_cmpint (after, ==, 1);
-  g_assert_cmpint (object, ==, 1);
-  g_assert_cmpint (object_after, ==, 1);
-
-  gtk_widget_destroy (GTK_WIDGET (window));
-  g_object_unref (builder);
-  
-  builder = builder_new_from_string (buffer_order, -1, NULL);
-  gtk_builder_connect_signals (builder, NULL);
-  window = gtk_builder_get_object (builder, "window1");
-  normal = 0;
-  gtk_window_set_title (GTK_WINDOW (window), "test");
-  g_assert (normal == 20);
-
-  gtk_widget_destroy (GTK_WIDGET (window));
-
-  gtk_builder_add_from_string (builder, buffer_extra,
-                              strlen (buffer_extra), NULL);
-  gtk_builder_add_from_string (builder, buffer_extra2,
-                              strlen (buffer_extra2), NULL);
-  gtk_builder_connect_signals (builder, NULL);
-  window = gtk_builder_get_object (builder, "window2");
-  gtk_window_set_title (GTK_WINDOW (window), "test");
-  g_assert (normal == 30);
-
-  gtk_widget_destroy (GTK_WIDGET (window));
-  window = gtk_builder_get_object (builder, "window3");
-  gtk_window_set_title (GTK_WINDOW (window), "test");
-  g_assert (normal == 40);
-  gtk_widget_destroy (GTK_WIDGET (window));
-  
-  g_object_unref (builder);
-
-  /* new test, reset globals */
-  after = 0;
-  normal = 0;
-  
-  builder = builder_new_from_string (buffer_after_child, -1, NULL);
-  window = gtk_builder_get_object (builder, "window1");
-  gtk_builder_connect_signals (builder, NULL);
-  gtk_window_set_title (GTK_WINDOW (window), "test");
-
-  g_assert (normal == 1);
-  gtk_widget_destroy (GTK_WIDGET (window));
-  g_object_unref (builder);
-}
-
-static void
-test_uimanager_simple (void)
-{
-  GtkBuilder *builder;
-  GObject *window, *uimgr, *menubar;
-  GObject *menu, *label;
-  GList *children;
-  const gchar buffer[] =
-    "<interface>"
-    "  <object class=\"GtkUIManager\" id=\"uimgr1\"/>"
-    "</interface>";
-    
-  const gchar buffer2[] =
-    "<interface>"
-    "  <object class=\"GtkUIManager\" id=\"uimgr1\">"
-    "    <child>"
-    "      <object class=\"GtkActionGroup\" id=\"ag1\">"
-    "        <child>"
-    "          <object class=\"GtkAction\" id=\"file\">"
-    "            <property name=\"label\">_File</property>"
-    "          </object>"
-    "          <accelerator key=\"n\" modifiers=\"GDK_CONTROL_MASK\"/>"
-    "        </child>"
-    "      </object>"
-    "    </child>"
-    "    <ui>"
-    "      <menubar name=\"menubar1\">"
-    "        <menu action=\"file\">"
-    "        </menu>"
-    "      </menubar>"
-    "    </ui>"
-    "  </object>"
-    "  <object class=\"GtkWindow\" id=\"window1\">"
-    "    <child>"
-    "      <object class=\"GtkMenuBar\" id=\"menubar1\" constructor=\"uimgr1\"/>"
-    "    </child>"
-    "  </object>"
-    "</interface>";
-
-  builder = builder_new_from_string (buffer, -1, NULL);
-
-  uimgr = gtk_builder_get_object (builder, "uimgr1");
-  g_assert (uimgr != NULL);
-  g_assert (GTK_IS_UI_MANAGER (uimgr));
-  g_object_unref (builder);
-  
-  builder = builder_new_from_string (buffer2, -1, NULL);
-
-  menubar = gtk_builder_get_object (builder, "menubar1");
-  g_assert (menubar != NULL);
-  g_assert (GTK_IS_MENU_BAR (menubar));
-
-  children = gtk_container_get_children (GTK_CONTAINER (menubar));
-  menu = children->data;
-  g_assert (menu != NULL);
-  g_assert (GTK_IS_MENU_ITEM (menu));
-  g_assert (strcmp (GTK_WIDGET (menu)->name, "file") == 0);
-  g_list_free (children);
-  
-  label = G_OBJECT (GTK_BIN (menu)->child);
-  g_assert (label != NULL);
-  g_assert (GTK_IS_LABEL (label));
-  g_assert (strcmp (gtk_label_get_text (GTK_LABEL (label)), "File") == 0);
-
-  window = gtk_builder_get_object (builder, "window1");
-  gtk_widget_destroy (GTK_WIDGET (window));
-  g_object_unref (builder);
-}
-
-static void
-test_domain (void)
-{
-  GtkBuilder *builder;
-  const gchar buffer1[] = "<interface/>";
-  const gchar buffer2[] = "<interface domain=\"domain\"/>";
-  const gchar *domain;
-  
-  builder = builder_new_from_string (buffer1, -1, NULL);
-  domain = gtk_builder_get_translation_domain (builder);
-  g_assert (domain == NULL);
-  g_object_unref (builder);
-  
-  builder = builder_new_from_string (buffer1, -1, "domain-1");
-  domain = gtk_builder_get_translation_domain (builder);
-  g_assert (domain);
-  g_assert (strcmp (domain, "domain-1") == 0);
-  g_object_unref (builder);
-  
-  builder = builder_new_from_string (buffer2, -1, NULL);
-  domain = gtk_builder_get_translation_domain (builder);
-  g_assert (domain == NULL);
-  g_object_unref (builder);
-  
-  builder = builder_new_from_string (buffer2, -1, "domain-1");
-  domain = gtk_builder_get_translation_domain (builder);
-  g_assert (domain);
-  g_assert (strcmp (domain, "domain-1") == 0);
-  g_object_unref (builder);
-}
-
-#if 0
-static void
-test_translation (void)
-{
-  GtkBuilder *builder;
-  const gchar buffer[] =
-    "<interface>"
-    "  <object class=\"GtkWindow\" id=\"window1\">"
-    "    <child>"
-    "      <object class=\"GtkLabel\" id=\"label\">"
-    "        <property name=\"label\" translatable=\"yes\">File</property>"
-    "      </object>"
-    "    </child>"
-    "  </object>"
-    "</interface>";
-  GtkLabel *window, *label;
-
-  setlocale (LC_ALL, "sv_SE");
-  textdomain ("builder");
-  bindtextdomain ("builder", "tests");
-
-  builder = builder_new_from_string (buffer, -1, NULL);
-  label = GTK_LABEL (gtk_builder_get_object (builder, "label"));
-  g_assert (strcmp (gtk_label_get_text (label), "Arkiv") == 0);
-
-  window = gtk_builder_get_object (builder, "window1");
-  gtk_widget_destroy (GTK_WIDGET (window));
-  g_object_unref (builder);
-}
-#endif
-
-static void
-test_sizegroup (void)
-{
-  GtkBuilder * builder;
-  const gchar buffer1[] =
-    "<interface domain=\"test\">"
-    "  <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
-    "    <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
-    "    <widgets>"
-    "      <widget name=\"radio1\"/>"
-    "      <widget name=\"radio2\"/>"
-    "    </widgets>"
-    "  </object>"
-    "  <object class=\"GtkWindow\" id=\"window1\">"
-    "    <child>"
-    "      <object class=\"GtkVBox\" id=\"vbox1\">"
-    "        <child>"
-    "          <object class=\"GtkRadioButton\" id=\"radio1\"/>"
-    "        </child>"
-    "        <child>"
-    "          <object class=\"GtkRadioButton\" id=\"radio2\"/>"
-    "        </child>"
-    "      </object>"
-    "    </child>"
-    "  </object>"
-    "</interface>";
-  const gchar buffer2[] =
-    "<interface domain=\"test\">"
-    "  <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
-    "    <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
-    "    <widgets>"
-    "    </widgets>"
-    "   </object>"
-    "</interface>";
-  const gchar buffer3[] =
-    "<interface domain=\"test\">"
-    "  <object class=\"GtkSizeGroup\" id=\"sizegroup1\">"
-    "    <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
-    "    <widgets>"
-    "      <widget name=\"radio1\"/>"
-    "      <widget name=\"radio2\"/>"
-    "    </widgets>"
-    "  </object>"
-    "  <object class=\"GtkSizeGroup\" id=\"sizegroup2\">"
-    "    <property name=\"mode\">GTK_SIZE_GROUP_HORIZONTAL</property>"
-    "    <widgets>"
-    "      <widget name=\"radio1\"/>"
-    "      <widget name=\"radio2\"/>"
-    "    </widgets>"
-    "  </object>"
-    "  <object class=\"GtkWindow\" id=\"window1\">"
-    "    <child>"
-    "      <object class=\"GtkVBox\" id=\"vbox1\">"
-    "        <child>"
-    "          <object class=\"GtkRadioButton\" id=\"radio1\"/>"
-    "        </child>"
-    "        <child>"
-    "          <object class=\"GtkRadioButton\" id=\"radio2\"/>"
-    "        </child>"
-    "      </object>"
-    "    </child>"
-    "  </object>"
-    "</interface>";
-  GObject *sizegroup;
-  GSList *widgets;
-
-  builder = builder_new_from_string (buffer1, -1, NULL);
-  sizegroup = gtk_builder_get_object (builder, "sizegroup1");
-  widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
-  g_assert (g_slist_length (widgets) == 2);
-  g_slist_free (widgets);
-  g_object_unref (builder);
-
-  builder = builder_new_from_string (buffer2, -1, NULL);
-  sizegroup = gtk_builder_get_object (builder, "sizegroup1");
-  widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
-  g_assert (g_slist_length (widgets) == 0);
-  g_slist_free (widgets);
-  g_object_unref (builder);
-
-  builder = builder_new_from_string (buffer3, -1, NULL);
-  sizegroup = gtk_builder_get_object (builder, "sizegroup1");
-  widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
-  g_assert (g_slist_length (widgets) == 2);
-  g_slist_free (widgets);
-  sizegroup = gtk_builder_get_object (builder, "sizegroup2");
-  widgets = gtk_size_group_get_widgets (GTK_SIZE_GROUP (sizegroup));
-  g_assert (g_slist_length (widgets) == 2);
-  g_slist_free (widgets);
-
-#if 0
-  {
-    GObject *window;
-    window = gtk_builder_get_object (builder, "window1");
-    gtk_widget_destroy (GTK_WIDGET (window));
-  }
-#endif  
-  g_object_unref (builder);
-}
-
-static void
-test_list_store (void)
-{
-  const gchar buffer1[] =
-    "<interface>"
-    "  <object class=\"GtkListStore\" id=\"liststore1\">"
-    "    <columns>"
-    "      <column type=\"gchararray\"/>"
-    "      <column type=\"guint\"/>"
-    "    </columns>"
-    "  </object>"
-    "</interface>";
-  const char buffer2[] = 
-    "<interface>"
-    "  <object class=\"GtkListStore\" id=\"liststore1\">"
-    "    <columns>"
-    "      <column type=\"gchararray\"/>"
-    "      <column type=\"gchararray\"/>"
-    "      <column type=\"gint\"/>"
-    "    </columns>"
-    "    <data>"
-    "      <row>"
-    "        <col id=\"0\" translatable=\"yes\">John</col>"
-    "        <col id=\"1\" context=\"foo\">Doe</col>"
-    "        <col id=\"2\" comment=\"foobar\">25</col>"
-    "      </row>"
-    "      <row>"
-    "        <col id=\"0\">Johan</col>"
-    "        <col id=\"1\">Dole</col>"
-    "        <col id=\"2\">50</col>"
-    "      </row>"
-    "    </data>"
-    "  </object>"
-    "</interface>";
-  const char buffer3[] = 
-    "<interface>"
-    "  <object class=\"GtkListStore\" id=\"liststore1\">"
-    "    <columns>"
-    "      <column type=\"gchararray\"/>"
-    "      <column type=\"gchararray\"/>"
-    "      <column type=\"gint\"/>"
-    "    </columns>"
-    "    <data>"
-    "      <row>"
-    "        <col id=\"1\" context=\"foo\">Doe</col>"
-    "        <col id=\"0\" translatable=\"yes\">John</col>"
-    "        <col id=\"2\" comment=\"foobar\">25</col>"
-    "      </row>"
-    "      <row>"
-    "        <col id=\"2\">50</col>"
-    "        <col id=\"1\">Dole</col>"
-    "        <col id=\"0\">Johan</col>"
-    "      </row>"
-    "      <row>"
-    "        <col id=\"2\">19</col>"
-    "      </row>"
-    "    </data>"
-    "  </object>"
-    "</interface>";
-  GtkBuilder *builder;
-  GObject *store;
-  GtkTreeIter iter;
-  gchar *surname, *lastname;
-  int age;
-  
-  builder = builder_new_from_string (buffer1, -1, NULL);
-  store = gtk_builder_get_object (builder, "liststore1");
-  g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 2);
-  g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
-  g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_UINT);
-  g_object_unref (builder);
-  
-  builder = builder_new_from_string (buffer2, -1, NULL);
-  store = gtk_builder_get_object (builder, "liststore1");
-  g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 3);
-  g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
-  g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_STRING);
-  g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2) == G_TYPE_INT);
-  
-  g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter) == TRUE);
-  gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
-                      0, &surname,
-                      1, &lastname,
-                      2, &age,
-                      -1);
-  g_assert (surname != NULL);
-  g_assert (strcmp (surname, "John") == 0);
-  g_free (surname);
-  g_assert (lastname != NULL);
-  g_assert (strcmp (lastname, "Doe") == 0);
-  g_free (lastname);
-  g_assert (age == 25);
-  g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE);
-  
-  gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
-                      0, &surname,
-                      1, &lastname,
-                      2, &age,
-                      -1);
-  g_assert (surname != NULL);
-  g_assert (strcmp (surname, "Johan") == 0);
-  g_free (surname);
-  g_assert (lastname != NULL);
-  g_assert (strcmp (lastname, "Dole") == 0);
-  g_free (lastname);
-  g_assert (age == 50);
-  g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == FALSE);
-  
-  builder = builder_new_from_string (buffer3, -1, NULL);
-  store = gtk_builder_get_object (builder, "liststore1");
-  g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 3);
-  g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
-  g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_STRING);
-  g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2) == G_TYPE_INT);
-  
-  g_assert (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter) == TRUE);
-  gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
-                      0, &surname,
-                      1, &lastname,
-                      2, &age,
-                      -1);
-  g_assert (surname != NULL);
-  g_assert (strcmp (surname, "John") == 0);
-  g_free (surname);
-  g_assert (lastname != NULL);
-  g_assert (strcmp (lastname, "Doe") == 0);
-  g_free (lastname);
-  g_assert (age == 25);
-  g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE);
-  
-  gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
-                      0, &surname,
-                      1, &lastname,
-                      2, &age,
-                      -1);
-  g_assert (surname != NULL);
-  g_assert (strcmp (surname, "Johan") == 0);
-  g_free (surname);
-  g_assert (lastname != NULL);
-  g_assert (strcmp (lastname, "Dole") == 0);
-  g_free (lastname);
-  g_assert (age == 50);
-  g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == TRUE);
-  
-  gtk_tree_model_get (GTK_TREE_MODEL (store), &iter,
-                      0, &surname,
-                      1, &lastname,
-                      2, &age,
-                      -1);
-  g_assert (surname == NULL);
-  g_assert (lastname == NULL);
-  g_assert (age == 19);
-  g_assert (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter) == FALSE);
-
-  g_object_unref (builder);
-}
-
-static void
-test_tree_store (void)
-{
-  const gchar buffer[] =
-    "<interface domain=\"test\">"
-    "  <object class=\"GtkTreeStore\" id=\"treestore1\">"
-    "    <columns>"
-    "      <column type=\"gchararray\"/>"
-    "      <column type=\"guint\"/>"
-    "    </columns>"
-    "  </object>"
-    "</interface>";
-  GtkBuilder *builder;
-  GObject *store;
-  
-  builder = builder_new_from_string (buffer, -1, NULL);
-  store = gtk_builder_get_object (builder, "treestore1");
-  g_assert (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)) == 2);
-  g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0) == G_TYPE_STRING);
-  g_assert (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1) == G_TYPE_UINT);
-  
-  g_object_unref (builder);
-}
-
-static void
-test_types (void)
-{
-  const gchar buffer[] = 
-    "<interface>"
-    "  <object class=\"GtkAction\" id=\"action\"/>"
-    "  <object class=\"GtkActionGroup\" id=\"actiongroup\"/>"
-    "  <object class=\"GtkAlignment\" id=\"alignment\"/>"
-    "  <object class=\"GtkArrow\" id=\"arrow\"/>"
-    "  <object class=\"GtkButton\" id=\"button\"/>"
-    "  <object class=\"GtkCheckButton\" id=\"checkbutton\"/>"
-    "  <object class=\"GtkDialog\" id=\"dialog\"/>"
-    "  <object class=\"GtkDrawingArea\" id=\"drawingarea\"/>"
-    "  <object class=\"GtkEventBox\" id=\"eventbox\"/>"
-    "  <object class=\"GtkEntry\" id=\"entry\"/>"
-    "  <object class=\"GtkFontButton\" id=\"fontbutton\"/>"
-    "  <object class=\"GtkHButtonBox\" id=\"hbuttonbox\"/>"
-    "  <object class=\"GtkHBox\" id=\"hbox\"/>"
-    "  <object class=\"GtkHPaned\" id=\"hpaned\"/>"
-    "  <object class=\"GtkHRuler\" id=\"hruler\"/>"
-    "  <object class=\"GtkHScale\" id=\"hscale\"/>"
-    "  <object class=\"GtkHScrollbar\" id=\"hscrollbar\"/>"
-    "  <object class=\"GtkHSeparator\" id=\"hseparator\"/>"
-    "  <object class=\"GtkImage\" id=\"image\"/>"
-    "  <object class=\"GtkLabel\" id=\"label\"/>"
-    "  <object class=\"GtkListStore\" id=\"liststore\"/>"
-    "  <object class=\"GtkMenuBar\" id=\"menubar\"/>"
-    "  <object class=\"GtkNotebook\" id=\"notebook\"/>"
-    "  <object class=\"GtkProgressBar\" id=\"progressbar\"/>"
-    "  <object class=\"GtkRadioButton\" id=\"radiobutton\"/>"
-    "  <object class=\"GtkSizeGroup\" id=\"sizegroup\"/>"
-    "  <object class=\"GtkScrolledWindow\" id=\"scrolledwindow\"/>"
-    "  <object class=\"GtkSpinButton\" id=\"spinbutton\"/>"
-    "  <object class=\"GtkStatusbar\" id=\"statusbar\"/>"
-    "  <object class=\"GtkTextView\" id=\"textview\"/>"
-    "  <object class=\"GtkToggleAction\" id=\"toggleaction\"/>"
-    "  <object class=\"GtkToggleButton\" id=\"togglebutton\"/>"
-    "  <object class=\"GtkToolbar\" id=\"toolbar\"/>"
-    "  <object class=\"GtkTreeStore\" id=\"treestore\"/>"
-    "  <object class=\"GtkTreeView\" id=\"treeview\"/>"
-    "  <object class=\"GtkTable\" id=\"table\"/>"
-    "  <object class=\"GtkVBox\" id=\"vbox\"/>"
-    "  <object class=\"GtkVButtonBox\" id=\"vbuttonbox\"/>"
-    "  <object class=\"GtkVScrollbar\" id=\"vscrollbar\"/>"
-    "  <object class=\"GtkVSeparator\" id=\"vseparator\"/>"
-    "  <object class=\"GtkViewport\" id=\"viewport\"/>"
-    "  <object class=\"GtkVRuler\" id=\"vruler\"/>"
-    "  <object class=\"GtkVPaned\" id=\"vpaned\"/>"
-    "  <object class=\"GtkVScale\" id=\"vscale\"/>"
-    "  <object class=\"GtkWindow\" id=\"window\"/>"
-    "  <object class=\"GtkUIManager\" id=\"uimanager\"/>"
-    "</interface>";
-  const gchar buffer2[] = 
-    "<interface>"
-    "  <object type-func=\"gtk_window_get_type\" id=\"window\"/>"
-    "</interface>";
-  const gchar buffer3[] = 
-    "<interface>"
-    "  <object type-func=\"xxx_invalid_get_type_function\" id=\"window\"/>"
-    "</interface>";
-  GtkBuilder *builder;
-  GObject *window;
-  GError *error;
-
-  builder = builder_new_from_string (buffer, -1, NULL);
-  gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "dialog")));
-  gtk_widget_destroy (GTK_WIDGET (gtk_builder_get_object (builder, "window")));
-  g_object_unref (builder);
-
-  builder = builder_new_from_string (buffer2, -1, NULL);
-  window = gtk_builder_get_object (builder, "window");
-  g_assert (window != NULL);
-  g_assert (GTK_IS_WINDOW (window));
-  gtk_widget_destroy (GTK_WIDGET (window));
-  g_object_unref (builder);
-  
-  error = NULL;
-  builder = gtk_builder_new ();
-  gtk_builder_add_from_string (builder, buffer3, -1, &error);
-  g_assert (error != NULL);
-  g_assert (error->domain == GTK_BUILDER_ERROR);
-  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_TYPE_FUNCTION);
-  g_error_free (error);
-  g_object_unref (builder);
-}
-
-static void
-test_spin_button (void)
-{
-  GtkBuilder *builder;
-  const gchar buffer[] =
-    "<interface>"
-    "<object class=\"GtkAdjustment\" id=\"adjustment1\">"
-    "<property name=\"lower\">0</property>"
-    "<property name=\"upper\">10</property>"
-    "<property name=\"step-increment\">2</property>"
-    "<property name=\"page-increment\">3</property>"
-    "<property name=\"page-size\">5</property>"
-    "<property name=\"value\">1</property>"
-    "</object>"
-    "<object class=\"GtkSpinButton\" id=\"spinbutton1\">"
-    "<property name=\"visible\">True</property>"
-    "<property name=\"adjustment\">adjustment1</property>"
-    "</object>"
-    "</interface>";
-  GObject *object;
-  GtkAdjustment *adjustment;
-  gdouble value;
-  
-  builder = builder_new_from_string (buffer, -1, NULL);
-  object = gtk_builder_get_object (builder, "spinbutton1");
-  g_assert (GTK_IS_SPIN_BUTTON (object));
-  adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (object));
-  g_assert (GTK_IS_ADJUSTMENT (adjustment));
-  g_object_get (adjustment, "value", &value, NULL);
-  g_assert (value == 1);
-  g_object_get (adjustment, "lower", &value, NULL);
-  g_assert (value == 0);
-  g_object_get (adjustment, "upper", &value, NULL);
-  g_assert (value == 10);
-  g_object_get (adjustment, "step-increment", &value, NULL);
-  g_assert (value == 2);
-  g_object_get (adjustment, "page-increment", &value, NULL);
-  g_assert (value == 3);
-  g_object_get (adjustment, "page-size", &value, NULL);
-  g_assert (value == 5);
-  
-  g_object_unref (builder);
-}
-
-static void
-test_notebook (void)
-{
-  GtkBuilder *builder;
-  const gchar buffer[] =
-    "<interface>"
-    "  <object class=\"GtkNotebook\" id=\"notebook1\">"
-    "    <child>"
-    "      <object class=\"GtkLabel\" id=\"label1\">"
-    "        <property name=\"label\">label1</property>"
-    "      </object>"
-    "    </child>"
-    "    <child type=\"tab\">"
-    "      <object class=\"GtkLabel\" id=\"tablabel1\">"
-    "        <property name=\"label\">tab_label1</property>"
-    "      </object>"
-    "    </child>"
-    "    <child>"
-    "      <object class=\"GtkLabel\" id=\"label2\">"
-    "        <property name=\"label\">label2</property>"
-    "      </object>"
-    "    </child>"
-    "    <child type=\"tab\">"
-    "      <object class=\"GtkLabel\" id=\"tablabel2\">"
-    "        <property name=\"label\">tab_label2</property>"
-    "      </object>"
-    "    </child>"
-    "  </object>"
-    "</interface>";
-  GObject *notebook;
-  GtkWidget *label;
-
-  builder = builder_new_from_string (buffer, -1, NULL);
-  notebook = gtk_builder_get_object (builder, "notebook1");
-  g_assert (notebook != NULL);
-  g_assert (gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook)) == 2);
-
-  label = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 0);
-  g_assert (GTK_IS_LABEL (label));
-  g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "label1") == 0);
-  label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (notebook), label);
-  g_assert (GTK_IS_LABEL (label));
-  g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "tab_label1") == 0);
-
-  label = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 1);
-  g_assert (GTK_IS_LABEL (label));
-  g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "label2") == 0);
-  label = gtk_notebook_get_tab_label (GTK_NOTEBOOK (notebook), label);
-  g_assert (GTK_IS_LABEL (label));
-  g_assert (strcmp (gtk_label_get_label (GTK_LABEL (label)), "tab_label2") == 0);
-
-  g_object_unref (builder);
-}
-
-static void
-test_construct_only_property (void)
-{
-  GtkBuilder *builder;
-  const gchar buffer[] =
-    "<interface>"
-    "  <object class=\"GtkWindow\" id=\"window1\">"
-    "    <property name=\"type\">GTK_WINDOW_POPUP</property>"
-    "  </object>"
-    "</interface>";
-  const gchar buffer2[] =
-    "<interface>"
-    "  <object class=\"GtkTextTagTable\" id=\"tagtable1\"/>"
-    "  <object class=\"GtkTextBuffer\" id=\"textbuffer1\">"
-    "    <property name=\"tag-table\">tagtable1</property>"
-    "  </object>"
-    "</interface>";
-  GObject *widget, *tagtable, *textbuffer;
-  GtkWindowType type;
-  
-  builder = builder_new_from_string (buffer, -1, NULL);
-  widget = gtk_builder_get_object (builder, "window1");
-  g_object_get (widget, "type", &type, NULL);
-  g_assert (type == GTK_WINDOW_POPUP);
-
-  gtk_widget_destroy (GTK_WIDGET (widget));
-  g_object_unref (builder);
-
-  builder = builder_new_from_string (buffer2, -1, NULL);
-  textbuffer = gtk_builder_get_object (builder, "textbuffer1");
-  g_assert (textbuffer != NULL);
-  g_object_get (textbuffer, "tag-table", &tagtable, NULL);
-  g_assert (tagtable == gtk_builder_get_object (builder, "tagtable1"));
-  g_object_unref (tagtable);
-  g_object_unref (builder);
-}
-
-static void
-test_object_properties (void)
-{
-  GtkBuilder *builder;
-  const gchar buffer[] =
-    "<interface>"
-    "  <object class=\"GtkWindow\" id=\"window1\">"
-    "    <child>"
-    "      <object class=\"GtkVBox\" id=\"vbox\">"
-    "        <property name=\"border-width\">10</property>"
-    "        <child>"
-    "          <object class=\"GtkLabel\" id=\"label1\">"
-    "            <property name=\"mnemonic-widget\">spinbutton1</property>"
-    "          </object>"
-    "        </child>"
-    "        <child>"
-    "          <object class=\"GtkSpinButton\" id=\"spinbutton1\"/>"
-    "        </child>"
-    "      </object>"
-    "    </child>"
-    "  </object>"
-    "</interface>";
-  const gchar buffer2[] =
-    "<interface>"
-    "  <object class=\"GtkWindow\" id=\"window2\"/>"
-    "</interface>";
-  GObject *label, *spinbutton, *window;
-  
-  builder = builder_new_from_string (buffer, -1, NULL);
-  label = gtk_builder_get_object (builder, "label1");
-  g_assert (label != NULL);
-  spinbutton = gtk_builder_get_object (builder, "spinbutton1");
-  g_assert (spinbutton != NULL);
-  g_assert (spinbutton == (GObject*)gtk_label_get_mnemonic_widget (GTK_LABEL (label)));
-
-  gtk_builder_add_from_string (builder, buffer2, -1, NULL);
-  window = gtk_builder_get_object (builder, "window2");
-  g_assert (window != NULL);
-  gtk_widget_destroy (GTK_WIDGET (window));
-
-  g_object_unref (builder);
-}
-
-static void
-test_children (void)
-{
-  GtkBuilder * builder;
-  GList *children;
-  const gchar buffer1[] =
-    "<interface>"
-    "  <object class=\"GtkWindow\" id=\"window1\">"
-    "    <child>"
-    "      <object class=\"GtkButton\" id=\"button1\">"
-    "        <property name=\"label\">Hello</property>"
-    "      </object>"
-    "    </child>"
-    "  </object>"
-    "</interface>";
-  const gchar buffer2[] =
-    "<interface>"
-    "  <object class=\"GtkDialog\" id=\"dialog1\">"
-    "    <child internal-child=\"vbox\">"
-    "      <object class=\"GtkVBox\" id=\"dialog1-vbox\">"
-    "        <property name=\"border-width\">10</property>"
-    "          <child internal-child=\"action_area\">"
-    "            <object class=\"GtkHButtonBox\" id=\"dialog1-action_area\">"
-    "              <property name=\"border-width\">20</property>"
-    "            </object>"
-    "          </child>"
-    "      </object>"
-    "    </child>"
-    "  </object>"
-    "</interface>";
-
-  GObject *window, *button;
-  GObject *dialog, *vbox, *action_area;
-  
-  builder = builder_new_from_string (buffer1, -1, NULL);
-  window = gtk_builder_get_object (builder, "window1");
-  g_assert (window != NULL);
-  g_assert (GTK_IS_WINDOW (window));
-
-  button = gtk_builder_get_object (builder, "button1");
-  g_assert (button != NULL);
-  g_assert (GTK_IS_BUTTON (button));
-  g_assert (strcmp (GTK_WIDGET (GTK_WIDGET (button)->parent)->name, "window1") == 0);
-
-  gtk_widget_destroy (GTK_WIDGET (window));
-  g_object_unref (builder);
-  
-  builder = builder_new_from_string (buffer2, -1, NULL);
-  dialog = gtk_builder_get_object (builder, "dialog1");
-  g_assert (dialog != NULL);
-  g_assert (GTK_IS_DIALOG (dialog));
-  children = gtk_container_get_children (GTK_CONTAINER (dialog));
-  g_assert (g_list_length (children) == 1);
-  g_list_free (children);
-  
-  vbox = gtk_builder_get_object (builder, "dialog1-vbox");
-  g_assert (vbox != NULL);
-  g_assert (GTK_IS_VBOX (vbox));
-  g_assert (GTK_WIDGET (vbox)->parent != NULL);
-  g_assert (strcmp (GTK_WIDGET (GTK_WIDGET (vbox)->parent)->name, "dialog1") == 0);
-  g_assert (GTK_CONTAINER (vbox)->border_width == 10);
-  g_assert (strcmp (GTK_WIDGET (GTK_DIALOG (dialog)->vbox)->name, "dialog1-vbox") == 0);
-
-  action_area = gtk_builder_get_object (builder, "dialog1-action_area");
-  g_assert (action_area != NULL);
-  g_assert (GTK_IS_HBUTTON_BOX (action_area));
-  g_assert (GTK_WIDGET (action_area)->parent != NULL);
-  g_assert (GTK_CONTAINER (action_area)->border_width == 20);
-  g_assert (GTK_DIALOG (dialog)->action_area != NULL);
-  g_assert (GTK_WIDGET (GTK_DIALOG (dialog)->action_area)->name != NULL);
-  g_assert (strcmp (GTK_WIDGET (GTK_DIALOG (dialog)->action_area)->name, "dialog1-action_area") == 0);
-  gtk_widget_destroy (GTK_WIDGET (dialog));
-  g_object_unref (builder);
-}
-
-static void
-test_child_properties (void)
-{
-  GtkBuilder * builder;
-  const gchar buffer1[] =
-    "<interface>"
-    "  <object class=\"GtkVBox\" id=\"vbox1\">"
-    "    <child>"
-    "      <object class=\"GtkLabel\" id=\"label1\"/>"
-    "      <packing>"
-    "        <property name=\"pack-type\">start</property>"
-    "      </packing>"
-    "    </child>"
-    "    <child>"
-    "      <object class=\"GtkLabel\" id=\"label2\"/>"
-    "      <packing>"
-    "        <property name=\"pack-type\">end</property>"
-    "      </packing>"
-    "    </child>"
-    "  </object>"
-    "</interface>";
-
-  GObject *label, *vbox;
-  GtkPackType pack_type;
-  
-  builder = builder_new_from_string (buffer1, -1, NULL);
-  vbox = gtk_builder_get_object (builder, "vbox1");
-  g_assert (GTK_IS_VBOX (vbox));
-
-  label = gtk_builder_get_object (builder, "label1");
-  g_assert (GTK_IS_LABEL (label));
-  gtk_container_child_get (GTK_CONTAINER (vbox),
-                           GTK_WIDGET (label),
-                           "pack-type",
-                           &pack_type,
-                           NULL);
-  g_assert (pack_type == GTK_PACK_START);
-  
-  label = gtk_builder_get_object (builder, "label2");
-  g_assert (GTK_IS_LABEL (label));
-  gtk_container_child_get (GTK_CONTAINER (vbox),
-                           GTK_WIDGET (label),
-                           "pack-type",
-                           &pack_type,
-                           NULL);
-  g_assert (pack_type == GTK_PACK_END);
-
-  g_object_unref (builder);
-}
-
-static void
-test_treeview_column (void)
-{
-  GtkBuilder *builder;
-  const gchar buffer[] =
-    "<interface>"
-    "<object class=\"GtkListStore\" id=\"liststore1\">"
-    "  <columns>"
-    "    <column type=\"gchararray\"/>"
-    "    <column type=\"guint\"/>"
-    "  </columns>"
-    "  <data>"
-    "    <row>"
-    "      <col id=\"0\">John</col>"
-    "      <col id=\"1\">25</col>"
-    "    </row>"
-    "  </data>"
-    "</object>"
-    "<object class=\"GtkWindow\" id=\"window1\">"
-    "  <child>"
-    "    <object class=\"GtkTreeView\" id=\"treeview1\">"
-    "      <property name=\"visible\">True</property>"
-    "      <property name=\"model\">liststore1</property>"
-    "      <child>"
-    "        <object class=\"GtkTreeViewColumn\" id=\"column1\">"
-    "          <property name=\"title\">Test</property>"
-    "          <child>"
-    "            <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
-    "            <attributes>"
-    "              <attribute name=\"text\">1</attribute>"
-    "            </attributes>"
-    "          </child>"
-    "        </object>"
-    "      </child>"
-    "      <child>"
-    "        <object class=\"GtkTreeViewColumn\" id=\"column2\">"
-    "          <property name=\"title\">Number</property>"
-    "          <child>"
-    "            <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
-    "            <attributes>"
-    "              <attribute name=\"text\">0</attribute>"
-    "            </attributes>"
-    "          </child>"
-    "        </object>"
-    "      </child>"
-    "    </object>"
-    "  </child>"
-    "</object>"
-    "</interface>";
-  GObject *window, *treeview;
-  GtkTreeViewColumn *column;
-  GList *renderers;
-  GObject *renderer;
-  gchar *text;
-
-  builder = builder_new_from_string (buffer, -1, NULL);
-  treeview = gtk_builder_get_object (builder, "treeview1");
-  g_assert (treeview);
-  g_assert (GTK_IS_TREE_VIEW (treeview));
-  column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), 0);
-  g_assert (GTK_IS_TREE_VIEW_COLUMN (column));
-  g_assert (strcmp (gtk_tree_view_column_get_title (column), "Test") == 0);
-
-  renderers = gtk_tree_view_column_get_cell_renderers (column);
-  g_assert (g_list_length (renderers) == 1);
-  renderer = g_list_nth_data (renderers, 0);
-  g_assert (renderer);
-  g_assert (GTK_IS_CELL_RENDERER_TEXT (renderer));
-  g_list_free (renderers);
-
-  gtk_widget_realize (GTK_WIDGET (treeview));
-
-  renderer = gtk_builder_get_object (builder, "renderer1");
-  g_object_get (renderer, "text", &text, NULL);
-  g_assert (text);
-  g_assert (strcmp (text, "25") == 0);
-  g_free (text);
-  
-  renderer = gtk_builder_get_object (builder, "renderer2");
-  g_object_get (renderer, "text", &text, NULL);
-  g_assert (text);
-  g_assert (strcmp (text, "John") == 0);
-  g_free (text);
-
-  gtk_widget_unrealize (GTK_WIDGET (treeview));
-
-  window = gtk_builder_get_object (builder, "window1");
-  gtk_widget_destroy (GTK_WIDGET (window));
-  
-  g_object_unref (builder);
-}
-
-static void
-test_icon_view (void)
-{
-  GtkBuilder *builder;
-  const gchar buffer[] =
-    "<interface>"
-    "  <object class=\"GtkListStore\" id=\"liststore1\">"
-    "    <columns>"
-    "      <column type=\"gchararray\"/>"
-    "      <column type=\"GdkPixbuf\"/>"
-    "    </columns>"
-    "    <data>"
-    "      <row>"
-    "        <col id=\"0\">test</col>"
-    "      </row>"
-    "    </data>"
-    "  </object>"
-    "  <object class=\"GtkWindow\" id=\"window1\">"
-    "    <child>"
-    "      <object class=\"GtkIconView\" id=\"iconview1\">"
-    "        <property name=\"model\">liststore1</property>"
-    "        <property name=\"text-column\">0</property>"
-    "        <property name=\"pixbuf-column\">1</property>"
-    "        <property name=\"visible\">True</property>"
-    "        <child>"
-    "          <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
-    "          <attributes>"
-    "            <attribute name=\"text\">0</attribute>"
-    "          </attributes>"
-    "        </child>"
-    "      </object>"
-    "    </child>"
-    "  </object>"
-    "</interface>";
-  GObject *window, *iconview, *renderer;
-  gchar *text;
-  
-  builder = builder_new_from_string (buffer, -1, NULL);
-  iconview = gtk_builder_get_object (builder, "iconview1");
-  g_assert (iconview);
-  g_assert (GTK_IS_ICON_VIEW (iconview));
-
-  gtk_widget_realize (GTK_WIDGET (iconview));
-
-  renderer = gtk_builder_get_object (builder, "renderer1");
-  g_object_get (renderer, "text", &text, NULL);
-  g_assert (text);
-  g_assert (strcmp (text, "test") == 0);
-  g_free (text);
-    
-  window = gtk_builder_get_object (builder, "window1");
-  gtk_widget_destroy (GTK_WIDGET (window));
-  g_object_unref (builder);
-}
-
-static void
-test_combo_box (void)
-{
-  GtkBuilder *builder;
-  const gchar buffer[] =
-    "<interface>"
-    "  <object class=\"GtkListStore\" id=\"liststore1\">"
-    "    <columns>"
-    "      <column type=\"guint\"/>"
-    "      <column type=\"gchararray\"/>"
-    "    </columns>"
-    "    <data>"
-    "      <row>"
-    "        <col id=\"0\">1</col>"
-    "        <col id=\"1\">Foo</col>"
-    "      </row>"
-    "      <row>"
-    "        <col id=\"0\">2</col>"
-    "        <col id=\"1\">Bar</col>"
-    "      </row>"
-    "    </data>"
-    "  </object>"
-    "  <object class=\"GtkWindow\" id=\"window1\">"
-    "    <child>"
-    "      <object class=\"GtkComboBox\" id=\"combobox1\">"
-    "        <property name=\"model\">liststore1</property>"
-    "        <property name=\"visible\">True</property>"
-    "        <child>"
-    "          <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
-    "          <attributes>"
-    "            <attribute name=\"text\">0</attribute>"
-    "          </attributes>"
-    "        </child>"
-    "        <child>"
-    "          <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
-    "          <attributes>"
-    "            <attribute name=\"text\">1</attribute>"
-    "          </attributes>"
-    "        </child>"
-    "      </object>"
-    "    </child>"
-    "  </object>"
-    "</interface>";
-  GObject *window, *combobox, *renderer;
-  gchar *text;
-
-  builder = builder_new_from_string (buffer, -1, NULL);
-  combobox = gtk_builder_get_object (builder, "combobox1");
-  g_assert (combobox);
-  gtk_widget_realize (GTK_WIDGET (combobox));
-
-  renderer = gtk_builder_get_object (builder, "renderer2");
-  g_assert (renderer);
-  g_object_get (renderer, "text", &text, NULL);
-  g_assert (text);
-  g_assert (strcmp (text, "Bar") == 0);
-  g_free (text);
-
-  renderer = gtk_builder_get_object (builder, "renderer1");
-  g_assert (renderer);
-  g_object_get (renderer, "text", &text, NULL);
-  g_assert (text);
-  g_assert (strcmp (text, "2") == 0);
-  g_free (text);
-
-  window = gtk_builder_get_object (builder, "window1");
-  gtk_widget_destroy (GTK_WIDGET (window));
-
-  g_object_unref (builder);
-}
-
-static void
-test_combo_box_entry (void)
-{
-  GtkBuilder *builder;
-  const gchar buffer[] =
-    "<interface>"
-    "  <object class=\"GtkListStore\" id=\"liststore1\">"
-    "    <columns>"
-    "      <column type=\"guint\"/>"
-    "      <column type=\"gchararray\"/>"
-    "    </columns>"
-    "    <data>"
-    "      <row>"
-    "        <col id=\"0\">1</col>"
-    "        <col id=\"1\">Foo</col>"
-    "      </row>"
-    "      <row>"
-    "        <col id=\"0\">2</col>"
-    "        <col id=\"1\">Bar</col>"
-    "      </row>"
-    "    </data>"
-    "  </object>"
-    "  <object class=\"GtkWindow\" id=\"window1\">"
-    "    <child>"
-    "      <object class=\"GtkComboBoxEntry\" id=\"comboboxentry1\">"
-    "        <property name=\"model\">liststore1</property>"
-    "        <property name=\"visible\">True</property>"
-    "        <child>"
-    "          <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
-    "            <attributes>"
-    "              <attribute name=\"text\">0</attribute>"
-    "            </attributes>"
-    "        </child>"
-    "        <child>"
-    "          <object class=\"GtkCellRendererText\" id=\"renderer2\"/>"
-    "            <attributes>"
-    "              <attribute name=\"text\">1</attribute>"
-    "            </attributes>"
-    "        </child>"
-    "      </object>"
-    "    </child>"
-    "  </object>"
-    "</interface>";
-  GObject *window, *combobox, *renderer;
-  gchar *text;
-
-  builder = builder_new_from_string (buffer, -1, NULL);
-  combobox = gtk_builder_get_object (builder, "comboboxentry1");
-  g_assert (combobox);
-
-  renderer = gtk_builder_get_object (builder, "renderer2");
-  g_assert (renderer);
-  g_object_get (renderer, "text", &text, NULL);
-  g_assert (text);
-  g_assert (strcmp (text, "Bar") == 0);
-  g_free (text);
-
-  renderer = gtk_builder_get_object (builder, "renderer1");
-  g_assert (renderer);
-  g_object_get (renderer, "text", &text, NULL);
-  g_assert (text);
-  g_assert (strcmp (text, "2") == 0);
-  g_free (text);
-
-  window = gtk_builder_get_object (builder, "window1");
-  gtk_widget_destroy (GTK_WIDGET (window));
-
-  g_object_unref (builder);
-}
-
-static void
-test_cell_view (void)
-{
-  GtkBuilder *builder;
-  gchar *buffer =
-    "<interface>"
-    "  <object class=\"GtkListStore\" id=\"liststore1\">"
-    "    <columns>"
-    "      <column type=\"gchararray\"/>"
-    "    </columns>"
-    "    <data>"
-    "      <row>"
-    "        <col id=\"0\">test</col>"
-    "      </row>"
-    "    </data>"
-    "  </object>"
-    "  <object class=\"GtkWindow\" id=\"window1\">"
-    "    <child>"
-    "      <object class=\"GtkCellView\" id=\"cellview1\">"
-    "        <property name=\"visible\">True</property>"
-    "        <property name=\"model\">liststore1</property>"
-    "        <child>"
-    "          <object class=\"GtkCellRendererText\" id=\"renderer1\"/>"
-    "          <attributes>"
-    "            <attribute name=\"text\">0</attribute>"
-    "          </attributes>"
-    "        </child>"
-    "      </object>"
-    "    </child>"
-    "  </object>"
-    "</interface>";
-  GObject *cellview;
-  GObject *model, *window;
-  GtkTreePath *path;
-  GList *renderers;
-  GObject *renderer;
-  gchar *text;
-  
-  builder = builder_new_from_string (buffer, -1, NULL);
-  cellview = gtk_builder_get_object (builder, "cellview1");
-  g_assert (builder);
-  g_assert (cellview);
-  g_assert (GTK_IS_CELL_VIEW (cellview));
-  g_object_get (cellview, "model", &model, NULL);
-  g_assert (model);
-  g_assert (GTK_IS_TREE_MODEL (model));
-  g_object_unref (model);
-  path = gtk_tree_path_new_first ();
-  gtk_cell_view_set_displayed_row (GTK_CELL_VIEW (cellview), path);
-  
-  renderers = gtk_cell_view_get_cell_renderers (GTK_CELL_VIEW (cellview));
-  g_assert (renderers);
-  g_assert (g_list_length (renderers) == 1);
-  
-  gtk_widget_realize (GTK_WIDGET (cellview));
-
-  renderer = g_list_nth_data (renderers, 0);
-  g_list_free (renderers);
-  g_assert (renderer);
-  g_object_get (renderer, "text", &text, NULL);
-  g_assert (strcmp (text, "test") == 0);
-  g_free (text);
-  gtk_tree_path_free (path);
-
-  window = gtk_builder_get_object (builder, "window1");
-  gtk_widget_destroy (GTK_WIDGET (window));
-  
-  g_object_unref (builder);
-}
-
-static void
-test_dialog (void)
-{
-  GtkBuilder * builder;
-  const gchar buffer1[] =
-    "<interface>"
-    "  <object class=\"GtkDialog\" id=\"dialog1\">"
-    "    <child internal-child=\"vbox\">"
-    "      <object class=\"GtkVBox\" id=\"dialog1-vbox\">"
-    "          <child internal-child=\"action_area\">"
-    "            <object class=\"GtkHButtonBox\" id=\"dialog1-action_area\">"
-    "              <child>"
-    "                <object class=\"GtkButton\" id=\"button_cancel\"/>"
-    "              </child>"
-    "              <child>"
-    "                <object class=\"GtkButton\" id=\"button_ok\"/>"
-    "              </child>"
-    "            </object>"
-    "          </child>"
-    "      </object>"
-    "    </child>"
-    "    <action-widgets>"
-    "      <action-widget response=\"3\">button_ok</action-widget>"
-    "      <action-widget response=\"-5\">button_cancel</action-widget>"
-    "    </action-widgets>"
-    "  </object>"
-    "</interface>";
-
-  GObject *dialog1;
-  GObject *button_ok;
-  GObject *button_cancel;
-  
-  builder = builder_new_from_string (buffer1, -1, NULL);
-  dialog1 = gtk_builder_get_object (builder, "dialog1");
-  button_ok = gtk_builder_get_object (builder, "button_ok");
-  g_assert (gtk_dialog_get_response_for_widget (GTK_DIALOG (dialog1), GTK_WIDGET (button_ok)) == 3);
-  button_cancel = gtk_builder_get_object (builder, "button_cancel");
-  g_assert (gtk_dialog_get_response_for_widget (GTK_DIALOG (dialog1), GTK_WIDGET (button_cancel)) == -5);
-  
-  gtk_widget_destroy (GTK_WIDGET (dialog1));
-  g_object_unref (builder);
-}
-
-static void
-test_accelerators (void)
-{
-  GtkBuilder *builder;
-  gchar *buffer =
-    "<interface>"
-    "  <object class=\"GtkWindow\" id=\"window1\">"
-    "    <child>"
-    "      <object class=\"GtkButton\" id=\"button1\">"
-    "        <accelerator key=\"q\" modifiers=\"GDK_CONTROL_MASK\" signal=\"clicked\"/>"
-    "      </object>"
-    "    </child>"
-    "  </object>"
-    "</interface>";
-  gchar *buffer2 =
-    "<interface>"
-    "  <object class=\"GtkWindow\" id=\"window1\">"
-    "    <child>"
-    "      <object class=\"GtkTreeView\" id=\"treeview1\">"
-    "        <signal name=\"cursor-changed\" handler=\"gtk_main_quit\"/>"
-    "        <accelerator key=\"f\" modifiers=\"GDK_CONTROL_MASK\" signal=\"grab_focus\"/>"
-    "      </object>"
-    "    </child>"
-    "  </object>"
-    "</interface>";
-  GObject *window1;
-  GSList *accel_groups;
-  GObject *accel_group;
-  
-  builder = builder_new_from_string (buffer, -1, NULL);
-  window1 = gtk_builder_get_object (builder, "window1");
-  g_assert (window1);
-  g_assert (GTK_IS_WINDOW (window1));
-
-  accel_groups = gtk_accel_groups_from_object (window1);
-  g_assert (g_slist_length (accel_groups) == 1);
-  accel_group = g_slist_nth_data (accel_groups, 0);
-  g_assert (accel_group);
-
-  gtk_widget_destroy (GTK_WIDGET (window1));
-  g_object_unref (builder);
-
-  builder = builder_new_from_string (buffer2, -1, NULL);
-  window1 = gtk_builder_get_object (builder, "window1");
-  g_assert (window1);
-  g_assert (GTK_IS_WINDOW (window1));
-
-  accel_groups = gtk_accel_groups_from_object (window1);
-  g_assert (g_slist_length (accel_groups) == 1);
-  accel_group = g_slist_nth_data (accel_groups, 0);
-  g_assert (accel_group);
-
-  gtk_widget_destroy (GTK_WIDGET (window1));
-  g_object_unref (builder);
-}
-
-static void
-test_widget (void)
-{
-  gchar *buffer =
-    "<interface>"
-    "  <object class=\"GtkWindow\" id=\"window1\">"
-    "    <child>"
-    "      <object class=\"GtkButton\" id=\"button1\">"
-    "         <property name=\"can-focus\">True</property>"
-    "         <property name=\"has-focus\">True</property>"
-    "      </object>"
-    "    </child>"
-    "  </object>"
-   "</interface>";
-  gchar *buffer2 =
-    "<interface>"
-    "  <object class=\"GtkWindow\" id=\"window1\">"
-    "    <child>"
-    "      <object class=\"GtkButton\" id=\"button1\">"
-    "         <property name=\"can-default\">True</property>"
-    "         <property name=\"has-default\">True</property>"
-    "      </object>"
-    "    </child>"
-    "  </object>"
-   "</interface>";
-  gchar *buffer3 =
-    "<interface>"
-    "  <object class=\"GtkWindow\" id=\"window1\">"
-    "    <child>"
-    "      <object class=\"GtkVBox\" id=\"vbox1\">"
-    "        <child>"
-    "          <object class=\"GtkLabel\" id=\"label1\">"
-    "            <child internal-child=\"accessible\">"
-    "              <object class=\"AtkObject\" id=\"a11y-label1\">"
-    "                <property name=\"AtkObject::accessible-name\">A Label</property>"
-    "              </object>"
-    "            </child>"
-    "            <accessibility>"
-    "              <relation target=\"button1\" type=\"label-for\"/>"
-    "            </accessibility>"
-    "          </object>"
-    "        </child>"
-    "        <child>"
-    "          <object class=\"GtkButton\" id=\"button1\">"
-    "            <accessibility>"
-    "              <action action_name=\"click\" description=\"Sliff\"/>"
-    "            </accessibility>"
-    "          </object>"
-    "        </child>"
-    "      </object>"
-    "    </child>"
-    "  </object>"
-    "</interface>";
-  GtkBuilder *builder;
-  GObject *window1, *button1, *label1;
-  AtkObject *accessible;
-  AtkRelationSet *relation_set;
-  AtkRelation *relation;
-  char *name;
-  
-  builder = builder_new_from_string (buffer, -1, NULL);
-  button1 = gtk_builder_get_object (builder, "button1");
-
-#if 0
-  g_assert (GTK_WIDGET_HAS_FOCUS (GTK_WIDGET (button1)));
-#endif
-  window1 = gtk_builder_get_object (builder, "window1");
-  gtk_widget_destroy (GTK_WIDGET (window1));
-  
-  g_object_unref (builder);
-  
-  builder = builder_new_from_string (buffer2, -1, NULL);
-  button1 = gtk_builder_get_object (builder, "button1");
-
-  g_assert (GTK_WIDGET_RECEIVES_DEFAULT (GTK_WIDGET (button1)));
-  
-  g_object_unref (builder);
-  
-  builder = builder_new_from_string (buffer3, -1, NULL);
-
-  window1 = gtk_builder_get_object (builder, "window1");
-  label1 = gtk_builder_get_object (builder, "label1");
-
-  accessible = gtk_widget_get_accessible (GTK_WIDGET (label1));
-  relation_set = atk_object_ref_relation_set (accessible);
-  g_return_if_fail (atk_relation_set_get_n_relations (relation_set) == 1);
-  relation = atk_relation_set_get_relation (relation_set, 0);
-  g_return_if_fail (relation != NULL);
-  g_return_if_fail (ATK_IS_RELATION (relation));
-  g_return_if_fail (atk_relation_get_relation_type (relation) != ATK_RELATION_LABELLED_BY);
-  g_object_unref (relation_set);
-
-  g_object_get (G_OBJECT (accessible), "accessible-name", &name, NULL);
-  g_return_if_fail (strcmp (name, "A Label") == 0);
-  g_free (name);
-  
-  gtk_widget_destroy (GTK_WIDGET (window1));
-  g_object_unref (builder);
-}
-
-static void
-test_window (void)
-{
-  gchar *buffer1 =
-    "<interface>"
-    "  <object class=\"GtkWindow\" id=\"window1\">"
-    "     <property name=\"title\"></property>"
-    "  </object>"
-   "</interface>";
-  gchar *buffer2 =
-    "<interface>"
-    "  <object class=\"GtkWindow\" id=\"window1\">"
-    "  </object>"
-   "</interface>";
-  GtkBuilder *builder;
-  GObject *window1;
-  gchar *title;
-  
-  builder = builder_new_from_string (buffer1, -1, NULL);
-  window1 = gtk_builder_get_object (builder, "window1");
-  g_object_get (window1, "title", &title, NULL);
-  g_assert (strcmp (title, "") == 0);
-  g_free (title);
-  gtk_widget_destroy (GTK_WIDGET (window1));
-  g_object_unref (builder);
-
-  builder = builder_new_from_string (buffer2, -1, NULL);
-  window1 = gtk_builder_get_object (builder, "window1");
-  gtk_widget_destroy (GTK_WIDGET (window1));
-  g_object_unref (builder);
-}
-
-static void
-test_value_from_string (void)
-{
-  GValue value = { 0 };
-  GError *error = NULL;
-  GtkBuilder *builder;
-
-  builder = gtk_builder_new ();
-  
-  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_STRING, "test", &value, &error));
-  g_assert (G_VALUE_HOLDS_STRING (&value));
-  g_assert (strcmp (g_value_get_string (&value), "test") == 0);
-  g_value_unset (&value);
-
-  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "true", &value, &error));
-  g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
-  g_assert (g_value_get_boolean (&value) == TRUE);
-  g_value_unset (&value);
-
-  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "false", &value, &error));
-  g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
-  g_assert (g_value_get_boolean (&value) == FALSE);
-  g_value_unset (&value);
-
-  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "yes", &value, &error));
-  g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
-  g_assert (g_value_get_boolean (&value) == TRUE);
-  g_value_unset (&value);
-
-  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "no", &value, &error));
-  g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
-  g_assert (g_value_get_boolean (&value) == FALSE);
-  g_value_unset (&value);
-
-  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "0", &value, &error));
-  g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
-  g_assert (g_value_get_boolean (&value) == FALSE);
-  g_value_unset (&value);
-
-  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "1", &value, &error));
-  g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
-  g_assert (g_value_get_boolean (&value) == TRUE);
-  g_value_unset (&value);
-
-  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "tRuE", &value, &error));
-  g_assert (G_VALUE_HOLDS_BOOLEAN (&value));
-  g_assert (g_value_get_boolean (&value) == TRUE);
-  g_value_unset (&value);
-  
-  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "blaurgh", &value, &error) == FALSE);
-  g_assert (error != NULL);
-  g_value_unset (&value);
-  g_assert (error->domain == GTK_BUILDER_ERROR);
-  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
-  g_error_free (error);
-  error = NULL;
-
-  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "yess", &value, &error) == FALSE);
-  g_value_unset (&value);
-  g_assert (error->domain == GTK_BUILDER_ERROR);
-  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
-  g_error_free (error);
-  error = NULL;
-  
-  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "trueee", &value, &error) == FALSE);
-  g_value_unset (&value);
-  g_assert (error->domain == GTK_BUILDER_ERROR);
-  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
-  g_error_free (error);
-  error = NULL;
-  
-  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "", &value, &error) == FALSE);
-  g_value_unset (&value);
-  g_assert (error->domain == GTK_BUILDER_ERROR);
-  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
-  g_error_free (error);
-  error = NULL;
-  
-  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_INT, "12345", &value, &error));
-  g_assert (G_VALUE_HOLDS_INT (&value));
-  g_assert (g_value_get_int (&value) == 12345);
-  g_value_unset (&value);
-
-  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_LONG, "9912345", &value, &error));
-  g_assert (G_VALUE_HOLDS_LONG (&value));
-  g_assert (g_value_get_long (&value) == 9912345);
-  g_value_unset (&value);
-
-  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_UINT, "2345", &value, &error));
-  g_assert (G_VALUE_HOLDS_UINT (&value));
-  g_assert (g_value_get_uint (&value) == 2345);
-  g_value_unset (&value);
-
-  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_FLOAT, "1.454", &value, &error));
-  g_assert (G_VALUE_HOLDS_FLOAT (&value));
-  g_assert (fabs (g_value_get_float (&value) - 1.454) < 0.00001);
-  g_value_unset (&value);
-
-  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_FLOAT, "abc", &value, &error) == FALSE);
-  g_value_unset (&value);
-  g_assert (error->domain == GTK_BUILDER_ERROR);
-  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
-  g_error_free (error);
-  error = NULL;
-
-  g_assert (gtk_builder_value_from_string_type (builder, G_TYPE_INT, "/-+,abc", &value, &error) == FALSE);
-  g_value_unset (&value);
-  g_assert (error->domain == GTK_BUILDER_ERROR);
-  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
-  g_error_free (error);
-  error = NULL;
-
-  g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "toplevel", &value, &error) == TRUE);
-  g_assert (G_VALUE_HOLDS_ENUM (&value));
-  g_assert (g_value_get_enum (&value) == GTK_WINDOW_TOPLEVEL);
-  g_value_unset (&value);
-
-  g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "sliff", &value, &error) == FALSE);
-  g_value_unset (&value);
-  g_assert (error->domain == GTK_BUILDER_ERROR);
-  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
-  g_error_free (error);
-  error = NULL;
-  
-  g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WIDGET_FLAGS, "mapped", &value, &error) == TRUE);
-  g_assert (G_VALUE_HOLDS_FLAGS (&value));
-  g_assert (g_value_get_flags (&value) == GTK_MAPPED);
-  g_value_unset (&value);
-
-  g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WIDGET_FLAGS, "GTK_VISIBLE | GTK_REALIZED", &value, &error) == TRUE);
-  g_assert (G_VALUE_HOLDS_FLAGS (&value));
-  g_assert (g_value_get_flags (&value) == (GTK_VISIBLE | GTK_REALIZED));
-  g_value_unset (&value);
-  
-  g_assert (gtk_builder_value_from_string_type (builder, GTK_TYPE_WINDOW_TYPE, "foobar", &value, &error) == FALSE);
-  g_value_unset (&value);
-  g_assert (error->domain == GTK_BUILDER_ERROR);
-  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_VALUE);
-  g_error_free (error);
-  error = NULL;
-  
-  g_object_unref (builder);
-}
-
-static gboolean model_freed = FALSE;
-
-static void
-model_weakref (gpointer data,
-               GObject *model)
-{
-  model_freed = TRUE;
-}
-
-static void
-test_reference_counting (void)
-{
-  GtkBuilder *builder;
-  const gchar buffer1[] =
-    "<interface>"
-    "  <object class=\"GtkListStore\" id=\"liststore1\"/>"
-    "  <object class=\"GtkListStore\" id=\"liststore2\"/>"
-    "  <object class=\"GtkWindow\" id=\"window1\">"
-    "    <child>"
-    "      <object class=\"GtkTreeView\" id=\"treeview1\">"
-    "        <property name=\"model\">liststore1</property>"
-    "      </object>"
-    "    </child>"
-    "  </object>"
-    "</interface>";
-  const gchar buffer2[] =
-    "<interface>"
-    "  <object class=\"GtkVBox\" id=\"vbox1\">"
-    "    <child>"
-    "      <object class=\"GtkLabel\" id=\"label1\"/>"
-    "      <packing>"
-    "        <property name=\"pack-type\">start</property>"
-    "      </packing>"
-    "    </child>"
-    "  </object>"
-    "</interface>";
-  GObject *window, *treeview, *model;
-  
-  builder = builder_new_from_string (buffer1, -1, NULL);
-  window = gtk_builder_get_object (builder, "window1");
-  treeview = gtk_builder_get_object (builder, "treeview1");
-  model = gtk_builder_get_object (builder, "liststore1");
-  g_object_unref (builder);
-
-  g_object_weak_ref (model, (GWeakNotify)model_weakref, NULL);
-
-  g_assert (model_freed == FALSE);
-  gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), NULL);
-  g_assert (model_freed == TRUE);
-  
-  gtk_widget_destroy (GTK_WIDGET (window));
-
-  builder = builder_new_from_string (buffer2, -1, NULL);
-  g_object_unref (builder);
-}
-
-static void
-test_icon_factory (void)
-{
-  GtkBuilder *builder;
-  const gchar buffer1[] =
-    "<interface>"
-    "  <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
-    "    <sources>"
-    "      <source stock-id=\"apple-red\" filename=\"apple-red.png\"/>"
-    "    </sources>"
-    "  </object>"
-    "</interface>";
-  const gchar buffer2[] =
-    "<interface>"
-    "  <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
-    "    <sources>"
-    "      <source stock-id=\"sliff\" direction=\"rtl\" state=\"active\""
-    "              size=\"menu\" filename=\"sloff.png\"/>"
-    "      <source stock-id=\"sliff\" direction=\"ltr\" state=\"selected\""
-    "              size=\"dnd\" filename=\"slurf.png\"/>"
-    "    </sources>"
-    "  </object>"
-    "</interface>";
-#if 0
-  const gchar buffer3[] =
-    "<interface>"
-    "  <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
-    "    <invalid/>"
-    "  </object>"
-    "</interface>";
-  const gchar buffer4[] =
-    "<interface>"
-    "  <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
-    "    <sources>"
-    "      <invalid/>"
-    "    </sources>"
-    "  </object>"
-    "</interface>";
-  const gchar buffer5[] =
-    "<interface>"
-    "  <object class=\"GtkIconFactory\" id=\"iconfactory1\">"
-    "    <sources>"
-    "      <source/>"
-    "    </sources>"
-    "  </object>"
-    "</interface>";
-  GError *error = NULL;
-#endif  
-  GObject *factory;
-  GtkIconSet *icon_set;
-  GtkIconSource *icon_source;
-  GtkWidget *image;
-  
-  builder = builder_new_from_string (buffer1, -1, NULL);
-  factory = gtk_builder_get_object (builder, "iconfactory1");
-  g_assert (factory != NULL);
-
-  icon_set = gtk_icon_factory_lookup (GTK_ICON_FACTORY (factory), "apple-red");
-  g_assert (icon_set != NULL);
-  gtk_icon_factory_add_default (GTK_ICON_FACTORY (factory));
-  image = gtk_image_new_from_stock ("apple-red", GTK_ICON_SIZE_BUTTON);
-  g_assert (image != NULL);
-
-  builder = builder_new_from_string (buffer2, -1, NULL);
-  factory = gtk_builder_get_object (builder, "iconfactory1");
-  g_assert (factory != NULL);
-
-  icon_set = gtk_icon_factory_lookup (GTK_ICON_FACTORY (factory), "sliff");
-  g_assert (icon_set != NULL);
-  g_assert (g_slist_length (icon_set->sources) == 2);
-
-  icon_source = icon_set->sources->data;
-  g_assert (gtk_icon_source_get_direction (icon_source) == GTK_TEXT_DIR_RTL);
-  g_assert (gtk_icon_source_get_state (icon_source) == GTK_STATE_ACTIVE);
-  g_assert (gtk_icon_source_get_size (icon_source) == GTK_ICON_SIZE_MENU);
-  g_assert (g_str_has_suffix (gtk_icon_source_get_filename (icon_source), "sloff.png"));
-  
-  icon_source = icon_set->sources->next->data;
-  g_assert (gtk_icon_source_get_direction (icon_source) == GTK_TEXT_DIR_LTR);
-  g_assert (gtk_icon_source_get_state (icon_source) == GTK_STATE_SELECTED);
-  g_assert (gtk_icon_source_get_size (icon_source) == GTK_ICON_SIZE_DND);
-  g_assert (g_str_has_suffix (gtk_icon_source_get_filename (icon_source), "slurf.png"));
-
-  g_object_unref (builder);
-
-#if 0
-  error = NULL;
-  gtk_builder_add_from_string (builder, buffer3, -1, &error);
-  g_assert (error != NULL);
-  g_assert (error->domain == GTK_BUILDER_ERROR);
-  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_TAG);
-  g_error_free (error);
-
-  error = NULL;
-  gtk_builder_add_from_string (builder, buffer4, -1, &error);
-  g_assert (error != NULL);
-  g_assert (error->domain == GTK_BUILDER_ERROR);
-  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_TAG);
-  g_error_free (error);
-
-  error = NULL;
-  gtk_builder_add_from_string (builder, buffer5, -1, &error);
-  g_assert (error != NULL);
-  g_assert (error->domain == GTK_BUILDER_ERROR);
-  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_ATTRIBUTE);
-  g_error_free (error);
-#endif
-
-}
-
-typedef struct {
-  gboolean weight;
-  gboolean foreground;
-  gboolean underline;
-  gboolean size;
-  gboolean font_desc;
-  gboolean language;
-} FoundAttrs;
-
-static gboolean 
-filter_pango_attrs (PangoAttribute *attr, 
-                   gpointer        data)
-{
-  FoundAttrs *found = (FoundAttrs *)data;
-
-  if (attr->klass->type == PANGO_ATTR_WEIGHT)
-    found->weight = TRUE;
-  else if (attr->klass->type == PANGO_ATTR_FOREGROUND)
-    found->foreground = TRUE;
-  else if (attr->klass->type == PANGO_ATTR_UNDERLINE)
-    found->underline = TRUE;
-  /* Make sure optional start/end properties are working */
-  else if (attr->klass->type == PANGO_ATTR_SIZE && 
-          attr->start_index == 5 &&
-          attr->end_index   == 10)
-    found->size = TRUE;
-  else if (attr->klass->type == PANGO_ATTR_FONT_DESC)
-    found->font_desc = TRUE;
-  else if (attr->klass->type == PANGO_ATTR_LANGUAGE)
-    found->language = TRUE;
-
-  return TRUE;
-}
-
-static void
-test_pango_attributes (void)
-{
-  GtkBuilder *builder;
-  FoundAttrs found = { 0, };
-  const gchar buffer[] =
-    "<interface>"
-    "  <object class=\"GtkLabel\" id=\"label1\">"
-    "    <attributes>"
-    "      <attribute name=\"weight\" value=\"PANGO_WEIGHT_BOLD\"/>"
-    "      <attribute name=\"foreground\" value=\"DarkSlateGray\"/>"
-    "      <attribute name=\"underline\" value=\"True\"/>"
-    "      <attribute name=\"size\" value=\"4\" start=\"5\" end=\"10\"/>"
-    "      <attribute name=\"font-desc\" value=\"Sans Italic 22\"/>"
-    "      <attribute name=\"language\" value=\"pt_BR\"/>"
-    "    </attributes>"
-    "  </object>"
-    "</interface>";
-  const gchar err_buffer1[] =
-    "<interface>"
-    "  <object class=\"GtkLabel\" id=\"label1\">"
-    "    <attributes>"
-    "      <attribute name=\"weight\"/>"
-    "    </attributes>"
-    "  </object>"
-    "</interface>";
-  const gchar err_buffer2[] =
-    "<interface>"
-    "  <object class=\"GtkLabel\" id=\"label1\">"
-    "    <attributes>"
-    "      <attribute name=\"weight\" value=\"PANGO_WEIGHT_BOLD\" unrecognized=\"True\"/>"
-    "    </attributes>"
-    "  </object>"
-    "</interface>";
-
-  GObject *label;
-  GError  *error = NULL;
-  PangoAttrList *attrs, *filtered;
-  
-  /* Test attributes are set */
-  builder = builder_new_from_string (buffer, -1, NULL);
-  label = gtk_builder_get_object (builder, "label1");
-  g_assert (label != NULL);
-
-  attrs = gtk_label_get_attributes (GTK_LABEL (label));
-  g_assert (attrs != NULL);
-
-  filtered = pango_attr_list_filter (attrs, filter_pango_attrs, &found);
-  g_assert (filtered);
-  pango_attr_list_unref (filtered);
-
-  g_assert (found.weight);
-  g_assert (found.foreground);
-  g_assert (found.underline);
-  g_assert (found.size);
-  g_assert (found.language);
-  g_assert (found.font_desc);
-
-  g_object_unref (builder);
-
-  /* Test errors are set */
-  builder = gtk_builder_new ();
-  gtk_builder_add_from_string (builder, err_buffer1, -1, &error);
-  label = gtk_builder_get_object (builder, "label1");
-  g_assert (error);
-  g_assert (error->domain == GTK_BUILDER_ERROR);
-  g_assert (error->code == GTK_BUILDER_ERROR_MISSING_ATTRIBUTE);
-  g_object_unref (builder);
-  g_error_free (error);
-  error = NULL;
-
-  builder = gtk_builder_new ();
-  gtk_builder_add_from_string (builder, err_buffer2, -1, &error);
-  label = gtk_builder_get_object (builder, "label1");
-
-  g_assert (error);
-  g_assert (error->domain == GTK_BUILDER_ERROR);
-  g_assert (error->code == GTK_BUILDER_ERROR_INVALID_ATTRIBUTE);
-  g_object_unref (builder);
-  g_error_free (error);
-
-}
-
-
-static void
-test_requires (void)
-{
-  GtkBuilder *builder;
-  GError     *error = NULL;
-  gchar      *buffer;
-  const gchar buffer_fmt[] =
-    "<interface>"
-    "  <requires lib=\"gtk+\" version=\"%d.%d\"/>"
-    "</interface>";
-
-  buffer = g_strdup_printf (buffer_fmt, GTK_MAJOR_VERSION, GTK_MINOR_VERSION + 1);
-  builder = gtk_builder_new ();
-  gtk_builder_add_from_string (builder, buffer, -1, &error);
-  g_assert (error);
-  g_assert (error->domain == GTK_BUILDER_ERROR);
-  g_assert (error->code == GTK_BUILDER_ERROR_VERSION_MISMATCH);
-  g_object_unref (builder);
-  g_error_free (error);
-}
-
-
-static void 
-test_file (const gchar *filename)
-{
-  GtkBuilder *builder;
-  GError *error = NULL;
-  GSList *l, *objects;
-
-  builder = gtk_builder_new ();
-
-  if (!gtk_builder_add_from_file (builder, filename, &error))
-    {
-      g_error (error->message);
-      g_error_free (error);
-      return;
-    }
-
-  objects = gtk_builder_get_objects (builder);
-  for (l = objects; l; l = l->next)
-    {
-      GObject *obj = (GObject*)l->data;
-
-      if (GTK_IS_DIALOG (obj))
-       {
-         int response;
-
-         g_print ("Running dialog %s.\n",
-                  gtk_widget_get_name (GTK_WIDGET (obj)));
-         response = gtk_dialog_run (GTK_DIALOG (obj));
-       }
-      else if (GTK_IS_WINDOW (obj))
-       {
-         g_signal_connect (obj, "destroy", G_CALLBACK (gtk_main_quit), NULL);
-         g_print ("Showing %s.\n",
-                  gtk_widget_get_name (GTK_WIDGET (obj)));
-         gtk_widget_show_all (GTK_WIDGET (obj));
-       }
-    }
-
-  gtk_main ();
-
-  g_object_unref (builder);
-  builder = NULL;
-}
-
-int
-main (int argc, char **argv)
-{
-  /* initialize test program */
-  gtk_test_init (&argc, &argv);
-
-  if (argc > 1)
-    {
-      test_file (argv[1]);
-      return 0;
-    }
-
-  g_test_add_func ("/Builder/Parser", test_parser);
-  g_test_add_func ("/Builder/Types", test_types);
-  g_test_add_func ("/Builder/Construct-Only Properties", test_construct_only_property);
-  g_test_add_func ("/Builder/Children", test_children);
-  g_test_add_func ("/Builder/Child Properties", test_child_properties);
-  g_test_add_func ("/Builder/Object Properties", test_object_properties);
-  g_test_add_func ("/Builder/Notebook", test_notebook);
-  g_test_add_func ("/Builder/Domain", test_domain);
-  g_test_add_func ("/Builder/Signal Autoconnect", test_connect_signals);
-  g_test_add_func ("/Builder/UIManager Simple", test_uimanager_simple);
-  g_test_add_func ("/Builder/Spin Button", test_spin_button);
-  g_test_add_func ("/Builder/SizeGroup", test_sizegroup);
-  g_test_add_func ("/Builder/ListStore", test_list_store);
-  g_test_add_func ("/Builder/TreeStore", test_tree_store);
-  g_test_add_func ("/Builder/TreeView Column", test_treeview_column);
-  g_test_add_func ("/Builder/IconView", test_icon_view);
-  g_test_add_func ("/Builder/ComboBox", test_combo_box);
-  g_test_add_func ("/Builder/ComboBox Entry", test_combo_box_entry);
-  g_test_add_func ("/Builder/CellView", test_cell_view);
-  g_test_add_func ("/Builder/Dialog", test_dialog);
-  g_test_add_func ("/Builder/Accelerators", test_accelerators);
-  g_test_add_func ("/Builder/Widget", test_widget);
-  g_test_add_func ("/Builder/Value From String", test_value_from_string);
-  g_test_add_func ("/Builder/Reference Counting", test_reference_counting);
-  g_test_add_func ("/Builder/Window", test_window);
-  g_test_add_func ("/Builder/IconFactory", test_icon_factory);
-  g_test_add_func ("/Builder/PangoAttributes", test_pango_attributes);
-  g_test_add_func ("/Builder/Requires", test_requires);
-
-  return g_test_run();
-}
diff --git a/tests/defaultvaluetest.c b/tests/defaultvaluetest.c
deleted file mode 100644 (file)
index c88926d..0000000
+++ /dev/null
@@ -1,341 +0,0 @@
-/* Gtk+ default value tests
- * Copyright (C) 2007 Christian Persch
- *               2007 Johan Dahlin
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#undef GTK_DISABLE_DEPRECATED
-#define GTK_ENABLE_BROKEN
-#include <string.h>
-#include <gtk/gtk.h>
-#include <gtk/gtkunixprint.h>
-
-static void
-check_property (const char *output,
-               GParamSpec *pspec,
-               GValue *value)
-{
-  GValue default_value = { 0, };
-  char *v, *dv, *msg;
-
-  if (g_param_value_defaults (pspec, value))
-      return;
-
-  g_value_init (&default_value, G_PARAM_SPEC_VALUE_TYPE (pspec));
-  g_param_value_set_default (pspec, &default_value);
-      
-  v = g_strdup_value_contents (value);
-  dv = g_strdup_value_contents (&default_value);
-  
-  msg = g_strdup_printf ("%s %s.%s: %s != %s\n",
-                        output,
-                        g_type_name (pspec->owner_type),
-                        pspec->name,
-                        dv, v);
-  g_assertion_message (G_LOG_DOMAIN, __FILE__, __LINE__,
-                      G_STRFUNC, msg);
-  g_free (msg);
-  
-  g_free (v);
-  g_free (dv);
-  g_value_unset (&default_value);
-}
-
-static void
-test_type (gconstpointer data)
-{
-  GObjectClass *klass;
-  GObject *instance;
-  GParamSpec **pspecs;
-  guint n_pspecs, i;
-  GType type;
-
-  type = * (GType *) data;
-
-  if (!G_TYPE_IS_CLASSED (type))
-    return;
-
-  if (G_TYPE_IS_ABSTRACT (type))
-    return;
-
-  if (!g_type_is_a (type, G_TYPE_OBJECT))
-    return;
-
-  /* These can't be freely constructed/destroyed */
-  if (g_type_is_a (type, GTK_TYPE_PRINT_JOB) ||
-      g_type_is_a (type, GDK_TYPE_PIXBUF_LOADER) ||
-      g_type_is_a (type, gdk_pixbuf_simple_anim_iter_get_type ()))
-    return;
-
-  /* The gtk_arg compat wrappers can't set up default values */
-  if (g_type_is_a (type, GTK_TYPE_CLIST) ||
-      g_type_is_a (type, GTK_TYPE_CTREE) ||
-      g_type_is_a (type, GTK_TYPE_LIST) ||
-      g_type_is_a (type, GTK_TYPE_TIPS_QUERY)) 
-    return;
-
-  klass = g_type_class_ref (type);
-  
-  if (g_type_is_a (type, GTK_TYPE_SETTINGS))
-    instance = g_object_ref (gtk_settings_get_default ());
-  else if (g_type_is_a (type, GDK_TYPE_PANGO_RENDERER))
-    instance = g_object_ref (gdk_pango_renderer_get_default (gdk_screen_get_default ()));
-  else if (g_type_is_a (type, GDK_TYPE_PIXMAP))
-    instance = g_object_ref (gdk_pixmap_new (NULL, 1, 1, 1));
-  else if (g_type_is_a (type, GDK_TYPE_COLORMAP))
-    instance = g_object_ref (gdk_colormap_new (gdk_visual_get_best (), TRUE));
-  else if (g_type_is_a (type, GDK_TYPE_WINDOW))
-    {
-      GdkWindowAttr attributes;
-      attributes.window_type = GDK_WINDOW_TEMP;
-      instance = g_object_ref (gdk_window_new (NULL, &attributes, 0));
-    }
-  else
-    instance = g_object_new (type, NULL);
-
-  if (g_type_is_a (type, G_TYPE_INITIALLY_UNOWNED))
-    g_object_ref_sink (instance);
-
-  pspecs = g_object_class_list_properties (klass, &n_pspecs);
-  for (i = 0; i < n_pspecs; ++i)
-    {
-      GParamSpec *pspec = pspecs[i];
-      GValue value = { 0, };
-      
-      if (pspec->owner_type != type)
-       continue;
-
-      if ((pspec->flags & G_PARAM_READABLE) == 0)
-       continue;
-
-      if (g_type_is_a (type, GDK_TYPE_DISPLAY_MANAGER) &&
-         (strcmp (pspec->name, "default-display") == 0))
-       continue;
-
-      if (g_type_is_a (type, GDK_TYPE_PANGO_RENDERER) &&
-         (strcmp (pspec->name, "screen") == 0))
-       continue;
-
-      if (g_type_is_a (type, GTK_TYPE_ABOUT_DIALOG) &&
-         (strcmp (pspec->name, "program-name") == 0))
-       continue;
-      
-      /* These are set to the current date */
-      if (g_type_is_a (type, GTK_TYPE_CALENDAR) &&
-         (strcmp (pspec->name, "year") == 0 ||
-          strcmp (pspec->name, "month") == 0 ||
-          strcmp (pspec->name, "day") == 0))
-       continue;
-
-      if (g_type_is_a (type, GTK_TYPE_CELL_RENDERER_TEXT) &&
-         (strcmp (pspec->name, "background-gdk") == 0 ||
-          strcmp (pspec->name, "foreground-gdk") == 0 ||
-          strcmp (pspec->name, "font") == 0 ||
-          strcmp (pspec->name, "font-desc") == 0))
-       continue;
-
-      if (g_type_is_a (type, GTK_TYPE_CELL_VIEW) &&
-         (strcmp (pspec->name, "background-gdk") == 0 ||
-          strcmp (pspec->name, "foreground-gdk") == 0))
-       continue;
-
-      if (g_type_is_a (type, GTK_TYPE_COLOR_BUTTON) &&
-         strcmp (pspec->name, "color") == 0)
-       continue;
-
-      if (g_type_is_a (type, GTK_TYPE_COLOR_SELECTION) &&
-         strcmp (pspec->name, "current-color") == 0)
-       continue;
-
-      /* Gets set to the cwd */
-      if (g_type_is_a (type, GTK_TYPE_FILE_SELECTION) &&
-         strcmp (pspec->name, "filename") == 0)
-       continue;
-
-      if (g_type_is_a (type, GTK_TYPE_FONT_SELECTION) &&
-         strcmp (pspec->name, "font") == 0)
-       continue;
-
-      if (g_type_is_a (type, GTK_TYPE_LAYOUT) &&
-         (strcmp (pspec->name, "hadjustment") == 0 ||
-           strcmp (pspec->name, "vadjustment") == 0))
-       continue;
-
-      if (g_type_is_a (type, GTK_TYPE_MESSAGE_DIALOG) &&
-         strcmp (pspec->name, "image") == 0)
-       continue;
-
-      if (g_type_is_a (type, GTK_TYPE_PRINT_OPERATION) &&
-         strcmp (pspec->name, "job-name") == 0)
-       continue;
-
-      if (g_type_is_a (type, GTK_TYPE_PRINT_UNIX_DIALOG) &&
-         (strcmp (pspec->name, "page-setup") == 0 ||
-          strcmp (pspec->name, "print-settings") == 0))
-       continue;
-
-      if (g_type_is_a (type, GTK_TYPE_PROGRESS_BAR) &&
-          strcmp (pspec->name, "adjustment") == 0)
-        continue;
-
-      /* filename value depends on $HOME */
-      if (g_type_is_a (type, GTK_TYPE_RECENT_MANAGER) &&
-          (strcmp (pspec->name, "filename") == 0 ||
-          strcmp (pspec->name, "size") == 0))
-        continue;
-
-      if (g_type_is_a (type, GTK_TYPE_SCALE_BUTTON) &&
-          strcmp (pspec->name, "adjustment") == 0)
-        continue;
-
-      if (g_type_is_a (type, GTK_TYPE_SCROLLED_WINDOW) &&
-         (strcmp (pspec->name, "hadjustment") == 0 ||
-           strcmp (pspec->name, "vadjustment") == 0))
-       continue;
-
-      /* these defaults come from XResources */
-      if (g_type_is_a (type, GTK_TYPE_SETTINGS) &&
-          strncmp (pspec->name, "gtk-xft-", 8) == 0)
-        continue;
-
-      if (g_type_is_a (type, GTK_TYPE_SETTINGS) &&
-          (strcmp (pspec->name, "color-hash") == 0 ||
-          strcmp (pspec->name, "gtk-cursor-theme-name") == 0 ||
-          strcmp (pspec->name, "gtk-cursor-theme-size") == 0 ||
-          strcmp (pspec->name, "gtk-double-click-time") == 0 ||
-          strcmp (pspec->name, "gtk-file-chooser-backend") == 0 ||
-          strcmp (pspec->name, "gtk-icon-theme-name") == 0 ||
-          strcmp (pspec->name, "gtk-fallback-icon-theme") == 0 ||
-          strcmp (pspec->name, "gtk-key-theme-name") == 0 ||
-          strcmp (pspec->name, "gtk-theme-name") == 0))
-        continue;
-
-      if (g_type_is_a (type, GTK_TYPE_SPIN_BUTTON) &&
-          (strcmp (pspec->name, "adjustment") == 0))
-        continue;
-
-      if (g_type_is_a (type, GTK_TYPE_STATUS_ICON) &&
-          (strcmp (pspec->name, "size") == 0 ||
-           strcmp (pspec->name, "screen") == 0))
-        continue;
-
-      if (g_type_is_a (type, GTK_TYPE_TEXT_BUFFER) &&
-          (strcmp (pspec->name, "tag-table") == 0 ||
-           strcmp (pspec->name, "copy-target-list") == 0 ||
-           strcmp (pspec->name, "paste-target-list") == 0))
-        continue;
-
-      /* language depends on the current locale */
-      if (g_type_is_a (type, GTK_TYPE_TEXT_TAG) &&
-          (strcmp (pspec->name, "background-gdk") == 0 ||
-           strcmp (pspec->name, "foreground-gdk") == 0 ||
-          strcmp (pspec->name, "language") == 0 ||
-          strcmp (pspec->name, "font") == 0 ||
-          strcmp (pspec->name, "font-desc") == 0))
-        continue;
-
-      if (g_type_is_a (type, GTK_TYPE_TEXT) &&
-         (strcmp (pspec->name, "hadjustment") == 0 ||
-           strcmp (pspec->name, "vadjustment") == 0))
-        continue;
-
-      if (g_type_is_a (type, GTK_TYPE_TEXT_VIEW) &&
-          strcmp (pspec->name, "buffer") == 0)
-        continue;
-
-      if (g_type_is_a (type, GTK_TYPE_TREE_VIEW) &&
-         (strcmp (pspec->name, "hadjustment") == 0 ||
-           strcmp (pspec->name, "vadjustment") == 0))
-       continue;
-
-      if (g_type_is_a (type, GTK_TYPE_VIEWPORT) &&
-         (strcmp (pspec->name, "hadjustment") == 0 ||
-           strcmp (pspec->name, "vadjustment") == 0))
-       continue;
-
-      if (g_type_is_a (type, GTK_TYPE_WIDGET) &&
-         (strcmp (pspec->name, "name") == 0 ||
-          strcmp (pspec->name, "screen") == 0 ||
-          strcmp (pspec->name, "style") == 0))
-       continue;
-
-      g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec));
-      g_object_get_property (instance, pspec->name, &value);
-      check_property ("Property", pspec, &value);
-      g_value_unset (&value);
-    }
-  g_free (pspecs);
-
-  if (g_type_is_a (type, GTK_TYPE_WIDGET))
-    {
-      pspecs = gtk_widget_class_list_style_properties (GTK_WIDGET_CLASS (klass), &n_pspecs);
-      
-      for (i = 0; i < n_pspecs; ++i)
-       {
-         GParamSpec *pspec = pspecs[i];
-         GValue value = { 0, };
-         
-         if (pspec->owner_type != type)
-           continue;
-
-         if ((pspec->flags & G_PARAM_READABLE) == 0)
-           continue;
-         
-         g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec));
-         gtk_widget_style_get_property (GTK_WIDGET (instance), pspec->name, &value);
-         check_property ("Style property", pspec, &value);
-         g_value_unset (&value);
-       }
-
-      g_free (pspecs);
-    }
-  
-  if (g_type_is_a (type, GDK_TYPE_WINDOW))
-    gdk_window_destroy (GDK_WINDOW (instance));
-  else
-    g_object_unref (instance);
-  
-  g_type_class_unref (klass);
-}
-
-extern void pixbuf_init (void);
-
-int
-main (int argc, char **argv)
-{
-  const GType *otypes;
-  guint i;
-
-  gtk_test_init (&argc, &argv);
-  pixbuf_init ();
-  gtk_test_register_all_types();
-  
-  otypes = gtk_test_list_all_types (NULL);
-  for (i = 0; otypes[i]; i++)
-    {
-      gchar *testname;
-      
-      testname = g_strdup_printf ("/Default Values/%s",
-                                 g_type_name (otypes[i]));
-      g_test_add_data_func (testname,
-                            &otypes[i],
-                           test_type);
-      g_free (testname);
-    }
-  
-  return g_test_run();
-}
diff --git a/tests/floatingtest.c b/tests/floatingtest.c
deleted file mode 100644 (file)
index d0682cf..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/* floatingtest.c - test floating flag uses
- * Copyright (C) 2005 Tim Janik
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-#undef GTK_DISABLE_DEPRECATED
-#include "../gtk/gtk.h"
-
-static gboolean destroyed = FALSE;
-static void
-destroy (void)
-{
-  destroyed = TRUE;
-}
-
-static void
-floating_tests (void)
-{
-  GtkWidget *widget = g_object_new (GTK_TYPE_LABEL, NULL);
-  g_object_connect (widget, "signal::destroy", destroy, NULL, NULL);
-
-  g_assert (GTK_OBJECT_FLOATING (widget));
-  g_assert (g_object_is_floating (widget));
-
-  GTK_OBJECT_UNSET_FLAGS (widget, GTK_FLOATING);
-  g_assert (!GTK_OBJECT_FLOATING (widget));
-  g_assert (!g_object_is_floating (widget));
-
-  GTK_OBJECT_SET_FLAGS (widget, GTK_FLOATING);
-  g_assert (GTK_OBJECT_FLOATING (widget));
-  g_assert (g_object_is_floating (widget));
-
-  g_object_ref_sink (widget);
-  g_assert (!GTK_OBJECT_FLOATING (widget));
-  g_assert (!g_object_is_floating (widget));
-
-  g_object_force_floating (G_OBJECT (widget));
-  g_assert (GTK_OBJECT_FLOATING (widget));
-  g_assert (g_object_is_floating (widget));
-
-  g_object_ref (widget);
-  gtk_object_sink (GTK_OBJECT (widget));
-  g_assert (!GTK_OBJECT_FLOATING (widget));
-  g_assert (!g_object_is_floating (widget));
-
-  g_assert (!destroyed);
-  g_object_unref (widget);
-  g_assert (destroyed);
-}
-
-int
-main (int   argc,
-      char *argv[])
-{
-  gtk_test_init (&argc, &argv);
-  g_test_add_func ("/floatingtest", floating_tests);
-  return g_test_run();
-}
diff --git a/tests/objecttests.c b/tests/objecttests.c
deleted file mode 100644 (file)
index c24ba9f..0000000
+++ /dev/null
@@ -1,358 +0,0 @@
-/* Gtk+ object tests
- * Copyright (C) 2007 Imendio AB
- * Authors: Tim Janik
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-#include <gtk/gtk.h>
-#include <string.h>
-
-/* --- helper macros for property value generation --- */
-/* dvalue=+0: generate minimum value
- * dvalue=.x: generate value within value range proportional to x.
- * dvalue=+1: generate maximum value
- * dvalue=-1: generate random value within value range
- * dvalue=+2: initialize value from default_value
- */
-#define ASSIGN_VALUE(__g_value_set_func, __value, PSPECTYPE, __pspec, __default_value, __minimum, __maximum, __dvalue) do { \
-  PSPECTYPE __p = (PSPECTYPE) __pspec; \
-  __g_value_set_func (__value, SELECT_VALUE (__dvalue, __p->__default_value, __p->__minimum, __p->__maximum)); \
-} while (0)
-#define SELECT_VALUE(__dvalue, __default_value, __minimum, __maximum) ( \
-  __dvalue >= 0 && __dvalue <= 1 ? __minimum * (1 - __dvalue) + __dvalue * __maximum : \
-    __dvalue <= -1 ? g_test_rand_double_range (__minimum, __maximum) : \
-      __default_value)
-#define SELECT_NAME(__dvalue) ( \
-  __dvalue == 0 ? "minimum" : \
-    __dvalue == 1 ? "maximum" : \
-      __dvalue >= +2 ? "default" : \
-        __dvalue == 0.5 ? "medium" : \
-          __dvalue > 0 && __dvalue < 1 ? "fractional" : \
-            "random")
-#define MATCH_ANY_VALUE         ((void*) 0xf1874c23)
-
-/* --- property blacklists --- */
-typedef struct {
-  const char   *type_name;
-  const char   *name;
-  gconstpointer value;
-} IgnoreProperty;
-static const IgnoreProperty*
-list_ignore_properties (gboolean buglist)
-{
-  /* currently untestable properties */
-  static const IgnoreProperty ignore_properties[] = {
-    { "GtkContainer",           "child",                NULL, },                        /* needs working child widget */
-    { "GtkRadioMenuItem",       "group",                NULL, },                        /* needs working sibling */
-    { "GtkWidget",              "parent",               NULL, },                        /* needs working parent widget */
-    { "GtkCList",               "selection-mode",       (void*) GTK_SELECTION_NONE, },
-    { "GtkWidget",              "has-default",          (void*) TRUE, },                /* conflicts with toplevel-less widgets */
-    { "GtkWidget",              "screen",               NULL, },
-    { "GtkWindow",              "type-hint",            (void*) GDK_WINDOW_TYPE_HINT_DND, }, /* conflicts with ::visible=TRUE */
-    { "GtkCellView",            "background",           (void*) "", },                  /* "" is not a valid background color */
-    { "GtkColorButton",         "color",                (void*) NULL, },                /* not a valid boxed color */
-    { "GtkInputDialog",         "has-separator",        (void*) MATCH_ANY_VALUE, },     /* property disabled */
-    { "GtkMessageDialog",       "has-separator",        (void*) MATCH_ANY_VALUE, },     /* property disabled */
-    { "GtkFontSelectionDialog", "has-separator",        (void*) MATCH_ANY_VALUE, },     /* property disabled */
-    { "GtkColorSelectionDialog","has-separator",        (void*) MATCH_ANY_VALUE, },     /* property disabled */
-    { "GtkColorSelection",      "child",                NULL, },
-    { "GtkColorSelection",      "current-color",        (void*) NULL, },                /* not a valid boxed color */
-    { "GtkComboBox",            "row-span-column",      (void*) MATCH_ANY_VALUE },      /* GtkComboBoxEntry needs a tree model for this */
-    { "GtkComboBox",            "column-span-column",   (void*) MATCH_ANY_VALUE },      /* GtkComboBoxEntry needs a tree model for this */
-    { "GtkComboBoxEntry",       "text-column",          (void*) MATCH_ANY_VALUE },      /* GtkComboBoxEntry needs a tree model for this */
-    { "GtkFileChooserButton",   "select-multiple",      (void*) MATCH_ANY_VALUE },      /* property disabled */
-    { "GtkFileChooserButton",   "action",               (void*) GTK_FILE_CHOOSER_ACTION_SAVE },
-    { "GtkFileChooserButton",   "action",               (void*) GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER },
-    { "GtkFileChooserWidget",   "select-multiple",      (void*) 0x1 },                  /* property conflicts */
-    { "GtkFileChooserDialog",   "select-multiple",      (void*) MATCH_ANY_VALUE },      /* property disabled */
-    { "GtkRecentChooserMenu",   "select-multiple",      (void*) MATCH_ANY_VALUE },      /* property disabled */
-    { "GtkTextView",            "overwrite",            (void*) MATCH_ANY_VALUE },      /* needs text buffer */
-    { "GtkToolbar",             "icon-size",            (void*) GTK_ICON_SIZE_INVALID },
-    { NULL, NULL, NULL }
-  };
-  /* properties suspected to be Gdk/Gtk+ bugs */
-  static const IgnoreProperty bug_properties[] = {
-    { "GtkMessageDialog",       "image",                NULL, },                        /* FIXME: should accept NULL images */
-    { "GtkOptionMenu",          "menu",                 NULL, },                        /* FIXME: should accept NULL menus */
-    { "GtkComboBox",            "active",               (void*) MATCH_ANY_VALUE },      /* FIXME: triggers NULL model bug */
-    { "GtkComboBoxEntry",       "text-column",          (void*) 0xffffffff },           /* FIXME: triggers signedness bug */
-    { "GtkCTree",               "indent",               (void*) MATCH_ANY_VALUE },      /* FIXME: triggers signedness bug */
-    { "GtkCTree",               "spacing",              (void*) MATCH_ANY_VALUE },      /* FIXME: triggers signedness bug */
-    { "GtkCurve",               "curve-type",           (void*) MATCH_ANY_VALUE },      /* FIXME: triggers OOM */
-    { "GtkCurve",               "min-x",                (void*) 0x80000000 },           /* FIXME: triggers coordinate OOB */
-    { "GtkCurve",               "min-y",                (void*) 0x80000000 },           /* FIXME: triggers coordinate OOB */
-    { "GtkCurve",               "max-x",                (void*) 0x80000000 },           /* FIXME: triggers coordinate OOB */
-    { "GtkCurve",               "max-y",                (void*) 0x80000000 },           /* FIXME: triggers coordinate OOB */
-    { "GtkFileChooserButton",   "local-only",           (void*) MATCH_ANY_VALUE },      /* FIXME: triggers NULL path assertion */
-    { "GtkFileChooserDialog",   "local-only",           (void*) MATCH_ANY_VALUE },      /* FIXME: triggers NULL path assertion */
-    { "GtkFileChooserDialog",   "action",               (void*) MATCH_ANY_VALUE },      /* FIXME: triggers closure->ref_count assertion */
-    { "GtkFileChooserDialog",   "visible",              (void*) TRUE },                 /* FIXME: triggers gtk_window_resize assertion */
-    { "GtkFileChooserWidget",   "local-only",           (void*) MATCH_ANY_VALUE },      /* FIXME: triggers NULL path assertion */
-    { "GtkFontSelection",       "font-name",            (void*) MATCH_ANY_VALUE },      /* FIXME: requires non-NULL GdkScreen */
-    { "GtkInvisible",           "has-focus",            (void*) TRUE },                 /* FIXME: triggers invalid window cast */
-    { "GtkInvisible",           "is-focus",             (void*) TRUE },                 /* FIXME: triggers invalid window cast */
-    { "GtkMenu",                "tearoff-state",        (void*) MATCH_ANY_VALUE },      /* FIXME: triggers NULL widget cast */
-    { "GtkProgress",            "activity-mode",        (void*) TRUE },                 /* FIXME: segfaults */
-    { "GtkScaleButton",         "adjustment",           NULL, },                        /* FIXME: should accept NULL adjustments */
-    { "GtkStatusbar",           "sensitive",            (void*) FALSE },                /* FIXME: check if widget is realize */
-    { "GtkTable",               "n-rows",               (void*) MATCH_ANY_VALUE },      /* FIXME: fix property minimum/maximum */
-    { "GtkTable",               "n-columns",            (void*) MATCH_ANY_VALUE },      /* FIXME: fix property minimum/maximum */
-    { "GtkText",                "text-position",        (void*) MATCH_ANY_VALUE },      /* FIXME: segfaults, fix property minimum/maximum */
-    { NULL, NULL, NULL }
-  };
-  if (buglist)
-    return bug_properties;
-  else
-    return ignore_properties;
-}
-
-/* --- test functions --- */
-static void
-pspec_select_value (GParamSpec *pspec,
-                    GValue     *value,
-                    double      dvalue)
-{
-  /* generate a value suitable for pspec */
-  if (G_IS_PARAM_SPEC_CHAR (pspec))
-    ASSIGN_VALUE (g_value_set_char, value, GParamSpecChar*, pspec, default_value, minimum, maximum, dvalue);
-  else if (G_IS_PARAM_SPEC_UCHAR (pspec))
-    ASSIGN_VALUE (g_value_set_uchar, value, GParamSpecUChar*, pspec, default_value, minimum, maximum, dvalue);
-  else if (G_IS_PARAM_SPEC_INT (pspec))
-    ASSIGN_VALUE (g_value_set_int, value, GParamSpecInt*, pspec, default_value, minimum, maximum, dvalue);
-  else if (G_IS_PARAM_SPEC_UINT (pspec))
-    ASSIGN_VALUE (g_value_set_uint, value, GParamSpecUInt*, pspec, default_value, minimum, maximum, dvalue);
-  else if (G_IS_PARAM_SPEC_LONG (pspec))
-    ASSIGN_VALUE (g_value_set_long, value, GParamSpecLong*, pspec, default_value, minimum, maximum, dvalue);
-  else if (G_IS_PARAM_SPEC_ULONG (pspec))
-    ASSIGN_VALUE (g_value_set_ulong, value, GParamSpecULong*, pspec, default_value, minimum, maximum, dvalue);
-  else if (G_IS_PARAM_SPEC_INT64 (pspec))
-    ASSIGN_VALUE (g_value_set_int64, value, GParamSpecInt64*, pspec, default_value, minimum, maximum, dvalue);
-  else if (G_IS_PARAM_SPEC_UINT64 (pspec))
-    ASSIGN_VALUE (g_value_set_uint64, value, GParamSpecUInt64*, pspec, default_value, minimum, maximum, dvalue);
-  else if (G_IS_PARAM_SPEC_FLOAT (pspec))
-    ASSIGN_VALUE (g_value_set_float, value, GParamSpecFloat*, pspec, default_value, minimum, maximum, dvalue);
-  else if (G_IS_PARAM_SPEC_DOUBLE (pspec))
-    ASSIGN_VALUE (g_value_set_double, value, GParamSpecDouble*, pspec, default_value, minimum, maximum, dvalue);
-  else if (G_IS_PARAM_SPEC_BOOLEAN (pspec))
-    g_value_set_boolean (value, SELECT_VALUE (dvalue, ((GParamSpecBoolean*) pspec)->default_value, FALSE, TRUE));
-  else if (G_IS_PARAM_SPEC_UNICHAR (pspec))
-    g_value_set_uint (value, SELECT_VALUE (dvalue, ((GParamSpecUnichar*) pspec)->default_value, FALSE, TRUE));
-  else if (G_IS_PARAM_SPEC_GTYPE (pspec))
-    g_value_set_gtype (value, SELECT_VALUE ((int) dvalue, ((GParamSpecGType*) pspec)->is_a_type, 0, GTK_TYPE_WIDGET));
-  else if (G_IS_PARAM_SPEC_STRING (pspec))
-    {
-      GParamSpecString *sspec = (GParamSpecString*) pspec;
-      if (dvalue >= +2)
-        g_value_set_string (value, sspec->default_value);
-      if (dvalue > 0 && sspec->cset_first && sspec->cset_nth)
-        g_value_take_string (value, g_strdup_printf ("%c%c", sspec->cset_first[0], sspec->cset_nth[0]));
-      else /* if (sspec->ensure_non_null) */
-        g_value_set_string (value, "");
-    }
-  else if (G_IS_PARAM_SPEC_ENUM (pspec))
-    {
-      GParamSpecEnum *espec = (GParamSpecEnum*) pspec;
-      if (dvalue >= +2)
-        g_value_set_enum (value, espec->default_value);
-      if (dvalue >= 0 && dvalue <= 1)
-        g_value_set_enum (value, espec->enum_class->values[(int) ((espec->enum_class->n_values - 1) * dvalue)].value);
-      else if (dvalue <= -1)
-        g_value_set_enum (value, espec->enum_class->values[g_test_rand_int_range (0, espec->enum_class->n_values)].value);
-    }
-  else if (G_IS_PARAM_SPEC_FLAGS (pspec))
-    {
-      GParamSpecFlags *fspec = (GParamSpecFlags*) pspec;
-      if (dvalue >= +2)
-        g_value_set_flags (value, fspec->default_value);
-      if (dvalue >= 0 && dvalue <= 1)
-        g_value_set_flags (value, fspec->flags_class->values[(int) ((fspec->flags_class->n_values - 1) * dvalue)].value);
-      else if (dvalue <= -1)
-        g_value_set_flags (value, fspec->flags_class->values[g_test_rand_int_range (0, fspec->flags_class->n_values)].value);
-    }
-  /* unimplemented:
-   * G_IS_PARAM_SPEC_PARAM
-   * G_IS_PARAM_SPEC_BOXED
-   * G_IS_PARAM_SPEC_POINTER
-   * G_IS_PARAM_SPEC_VALUE_ARRAY
-   * G_IS_PARAM_SPEC_OBJECT
-   */
-}
-
-static gpointer
-value_as_pointer (GValue *value)
-{
-  if (g_value_fits_pointer (value))
-    return g_value_peek_pointer (value);
-  if (G_VALUE_HOLDS_BOOLEAN (value))
-    return (void*) g_value_get_boolean (value);
-  if (G_VALUE_HOLDS_CHAR (value))
-    return (void*) (gssize) g_value_get_char (value);
-  if (G_VALUE_HOLDS_UCHAR (value))
-    return (void*) (gsize) g_value_get_uchar (value);
-  if (G_VALUE_HOLDS_INT (value))
-    return (void*) g_value_get_int (value);
-  if (G_VALUE_HOLDS_UINT (value))
-    return (void*) g_value_get_uint (value);
-  if (G_VALUE_HOLDS_LONG (value))
-    return (void*) g_value_get_long (value);
-  if (G_VALUE_HOLDS_ULONG (value))
-    return (void*) g_value_get_ulong (value);
-  if (G_VALUE_HOLDS_FLOAT (value))
-    return (void*) (gssize) g_value_get_float (value);
-  if (G_VALUE_HOLDS_DOUBLE (value))
-    return (void*) (gssize) g_value_get_double (value);
-  if (G_VALUE_HOLDS_ENUM (value))
-    return (void*) (gssize) g_value_get_enum (value);
-  if (G_VALUE_HOLDS_FLAGS (value))
-    return (void*) (gsize) g_value_get_flags (value);
-  return (void*) 0x1373babe;
-}
-
-static void
-object_test_property (GObject           *object,
-                      GParamSpec        *pspec,
-                      double             dvalue)
-{
-  /* test setting of a normal writable property */
-  if (pspec->flags & G_PARAM_WRITABLE &&
-      !(pspec->flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY)))
-    {
-      GValue value = { 0, };
-      guint i;
-      const IgnoreProperty *ignore_properties;
-      /* select value to set */
-      g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec));
-      pspec_select_value (pspec, &value, dvalue);
-      /* ignore untestable properties */
-      ignore_properties = list_ignore_properties (FALSE);
-      for (i = 0; ignore_properties[i].name; i++)
-        if (g_type_is_a (G_OBJECT_TYPE (object), g_type_from_name (ignore_properties[i].type_name)) &&
-            strcmp (pspec->name, ignore_properties[i].name) == 0 &&
-            (MATCH_ANY_VALUE == ignore_properties[i].value ||
-             value_as_pointer (&value) == ignore_properties[i].value ||
-             (G_VALUE_HOLDS_STRING (&value) &&
-              strcmp (g_value_get_string (&value), ignore_properties[i].value) == 0)))
-          break;
-      /* ignore known property bugs if not testing thoroughly */
-      if (ignore_properties[i].name == NULL && !g_test_thorough())
-        {
-          ignore_properties = list_ignore_properties (TRUE);
-          for (i = 0; ignore_properties[i].name; i++)
-            if (g_type_is_a (G_OBJECT_TYPE (object), g_type_from_name (ignore_properties[i].type_name)) &&
-                strcmp (pspec->name, ignore_properties[i].name) == 0 &&
-                (MATCH_ANY_VALUE == ignore_properties[i].value ||
-                 value_as_pointer (&value) == ignore_properties[i].value ||
-                 (G_VALUE_HOLDS_STRING (&value) &&
-                  strcmp (g_value_get_string (&value), ignore_properties[i].value) == 0)))
-              break;
-        }
-      /* assign unignored properties */
-      if (ignore_properties[i].name == NULL)
-        {
-          if (g_test_verbose())
-            g_print ("PropertyTest: %s::%s := (%s value (%s): %p)\n",
-                     g_type_name (G_OBJECT_TYPE (object)), pspec->name,
-                     SELECT_NAME (dvalue), g_type_name (G_VALUE_TYPE (&value)),
-                     value_as_pointer (&value));
-          g_object_set_property (object, pspec->name, &value);
-        }
-      /* cleanups */
-      g_value_unset (&value);
-    }
-}
-
-static void
-widget_test_properties (GtkWidget   *widget,
-                        double       dvalue)
-{
-  /* try setting all possible properties, according to dvalue */
-  guint i, n_pspecs = 0;
-  GParamSpec **pspecs = g_object_class_list_properties (G_OBJECT_GET_CLASS (widget), &n_pspecs);
-  for (i = 0; i < n_pspecs; i++)
-    {
-      GParamSpec *pspec = pspecs[i];
-      if (pspec->flags & G_PARAM_WRITABLE &&
-          !(pspec->flags & (G_PARAM_CONSTRUCT | G_PARAM_CONSTRUCT_ONLY)))
-        object_test_property (G_OBJECT (widget), pspecs[i], dvalue);
-    }
-  g_free (pspecs);
-}
-
-static void
-widget_fixups (GtkWidget *widget)
-{
-  /* post-constructor for widgets that need additional settings to work correctly */
-  if (GTK_IS_COMBO_BOX_ENTRY (widget))
-    {
-      GtkListStore *store = gtk_list_store_new (1, G_TYPE_STRING);
-      g_object_set (widget, "model", store, "text-column", 0, NULL);
-      g_object_unref (store);
-      gtk_combo_box_append_text (GTK_COMBO_BOX (widget), "test text");
-    }
-  else if (GTK_IS_COMBO_BOX (widget))
-    {
-      GtkListStore *store = gtk_list_store_new (1, G_TYPE_STRING);
-      g_object_set (widget, "model", store, NULL);
-      g_object_unref (store);
-      gtk_combo_box_append_text (GTK_COMBO_BOX (widget), "test text");
-    }
-}
-
-static void
-widget_property_tests (gconstpointer test_data)
-{
-  GType wtype = (GType) test_data;
-  /* create widget */
-  GtkWidget *widget = gtk_widget_new (wtype, NULL);
-  g_object_ref_sink (widget);
-  widget_fixups (widget);
-  /* test property values */
-  widget_test_properties (widget,  +2); /* test default_value */
-  widget_test_properties (widget,   0); /* test minimum */
-  widget_test_properties (widget, 0.5); /* test medium */
-  widget_test_properties (widget,   1); /* test maximum */
-  widget_test_properties (widget,  -1); /* test random value */
-  /* cleanup */
-  gtk_widget_destroy (widget);
-  g_object_unref (widget);
-}
-
-extern void pixbuf_init (void);
-
-/* --- main test program --- */
-int
-main (int   argc,
-      char *argv[])
-{
-  const GType *otypes;
-  guint i;
-  /* initialize test program */
-  pixbuf_init ();
-  gtk_test_init (&argc, &argv);
-  gtk_test_register_all_types();
-  /* install a property test for each widget type */
-  otypes = gtk_test_list_all_types (NULL);
-  for (i = 0; otypes[i]; i++)
-    if (g_type_is_a (otypes[i], GTK_TYPE_WIDGET) &&
-        G_TYPE_IS_OBJECT (otypes[i]) &&
-        !G_TYPE_IS_ABSTRACT (otypes[i]))
-      {
-        gchar *testpath = g_strdup_printf ("/properties/%s", g_type_name (otypes[i]));
-        g_test_add_data_func (testpath, (void*) otypes[i], widget_property_tests);
-        g_free (testpath);
-      }
-  return g_test_run();
-}
diff --git a/tests/pixbuf-init.c b/tests/pixbuf-init.c
deleted file mode 100644 (file)
index f4faa9a..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <config.h>
-#include <glib.h>
-
-#include <sys/stat.h>
-#include <stdlib.h>
-
-static gboolean
-file_exists (const char *filename)
-{
-  struct stat statbuf;
-
-  return stat (filename, &statbuf) == 0;
-}
-
-void
-pixbuf_init (void)
-{
-  if (file_exists ("../gdk-pixbuf/libpixbufloader-pnm.la"))
-    g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/gdk-pixbuf.loaders", TRUE);
-}
diff --git a/tests/textbuffertest.c b/tests/textbuffertest.c
deleted file mode 100644 (file)
index 3fdbf9f..0000000
+++ /dev/null
@@ -1,1308 +0,0 @@
-/* testtextbuffer.c -- Simplistic test suite
- * Copyright (C) 2000 Red Hat, Inc
- * Author: Havoc Pennington
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <gtk/gtk.h>
-#include "gtk/gtktexttypes.h" /* Private header, for UNKNOWN_CHAR */
-
-static void
-gtk_text_iter_spew (const GtkTextIter *iter, const gchar *desc)
-{
-  g_print (" %20s: line %d / char %d / line char %d / line byte %d\n",
-           desc,
-           gtk_text_iter_get_line (iter),
-           gtk_text_iter_get_offset (iter),
-           gtk_text_iter_get_line_offset (iter),
-           gtk_text_iter_get_line_index (iter));
-}
-
-static void
-check_get_set_text (GtkTextBuffer *buffer,
-                    const char    *str)
-{
-  GtkTextIter start, end, iter;
-  char *text;
-  int n;
-  
-  gtk_text_buffer_set_text (buffer, str, -1);
-  if (gtk_text_buffer_get_char_count (buffer) != g_utf8_strlen (str, -1))
-    g_error ("Wrong number of chars (%d not %d)",
-             gtk_text_buffer_get_char_count (buffer),
-             (int) g_utf8_strlen (str, -1));
-  gtk_text_buffer_get_bounds (buffer, &start, &end);
-  text = gtk_text_buffer_get_text (buffer, &start, &end, TRUE);
-  if (strcmp (text, str) != 0)
-    g_error ("Got '%s' as buffer contents", text);
-  g_free (text);
-
-  /* line char counts */
-  iter = start;
-  n = 0;
-  do
-    {
-      n += gtk_text_iter_get_chars_in_line (&iter);
-    }
-  while (gtk_text_iter_forward_line (&iter));
-
-  if (n != gtk_text_buffer_get_char_count (buffer))
-    g_error ("Sum of chars in lines is %d but buffer char count is %d",
-             n, gtk_text_buffer_get_char_count (buffer));
-
-  /* line byte counts */
-  iter = start;
-  n = 0;
-  do
-    {
-      n += gtk_text_iter_get_bytes_in_line (&iter);
-    }
-  while (gtk_text_iter_forward_line (&iter));
-
-  if (n != strlen (str))
-    g_error ("Sum of chars in lines is %d but buffer byte count is %d",
-             n, (int) strlen (str));
-  
-  gtk_text_buffer_set_text (buffer, "", -1);
-
-  n = gtk_text_buffer_get_line_count (buffer);
-  if (n != 1)
-    g_error ("%d lines, expected 1", n);
-
-  n = gtk_text_buffer_get_char_count (buffer);
-  if (n != 0)
-    g_error ("%d chars, expected 0", n);
-}
-
-static gint
-count_toggles_at_iter (GtkTextIter *iter,
-                       GtkTextTag  *of_tag)
-{
-  GSList *tags;
-  GSList *tmp;
-  gint count = 0;
-  
-  /* get toggle-ons and toggle-offs */
-  tags = gtk_text_iter_get_toggled_tags (iter, TRUE);
-  tags = g_slist_concat (tags,
-                         gtk_text_iter_get_toggled_tags (iter, FALSE));
-  
-  tmp = tags;
-  while (tmp != NULL)
-    {
-      if (of_tag == NULL)
-        ++count;
-      else if (of_tag == tmp->data)
-        ++count;
-      
-      tmp = g_slist_next (tmp);
-    }
-  
-  g_slist_free (tags);
-
-  return count;
-}
-
-static gint
-count_toggles_in_range_by_char (GtkTextBuffer     *buffer,
-                                GtkTextTag        *of_tag,
-                                const GtkTextIter *start,
-                                const GtkTextIter *end)
-{
-  GtkTextIter iter;
-  gint count = 0;
-  
-  iter = *start;
-  do
-    {
-      count += count_toggles_at_iter (&iter, of_tag);
-      if (!gtk_text_iter_forward_char (&iter))
-        {
-          /* end iterator */
-          count += count_toggles_at_iter (&iter, of_tag);
-          break;
-        }
-    }
-  while (gtk_text_iter_compare (&iter, end) <= 0);
-  
-  return count;
-}
-
-static gint
-count_toggles_in_buffer (GtkTextBuffer *buffer,
-                         GtkTextTag    *of_tag)
-{
-  GtkTextIter start, end;
-
-  gtk_text_buffer_get_bounds (buffer, &start, &end);
-
-  return count_toggles_in_range_by_char (buffer, of_tag, &start, &end);
-}
-
-static void
-check_specific_tag_in_range (GtkTextBuffer     *buffer,
-                             const gchar       *tag_name,
-                             const GtkTextIter *start,
-                             const GtkTextIter *end)
-{
-  GtkTextIter iter;
-  GtkTextTag *tag;
-  gboolean state;
-  gint count;
-  gint buffer_count;
-  gint last_offset;
-
-  if (gtk_text_iter_compare (start, end) > 0)
-    {
-      g_print ("  (inverted range for checking tags, skipping)\n");
-      return;
-    }
-  
-  tag = gtk_text_tag_table_lookup (gtk_text_buffer_get_tag_table (buffer),
-                                   tag_name);
-
-  buffer_count = count_toggles_in_range_by_char (buffer, tag, start, end);
-  
-  state = FALSE;
-  count = 0;
-
-  last_offset = -1;
-  iter = *start;
-  if (gtk_text_iter_toggles_tag (&iter, tag) ||
-      gtk_text_iter_forward_to_tag_toggle (&iter, tag))
-    {
-      do
-        {
-          gint this_offset;
-          
-          ++count;
-
-          this_offset = gtk_text_iter_get_offset (&iter);
-
-          if (this_offset <= last_offset)
-            g_error ("forward_to_tag_toggle moved in wrong direction");
-
-          last_offset = this_offset;
-          
-          if (gtk_text_iter_begins_tag (&iter, tag))
-            {
-              if (state)
-                g_error ("Tag %p is already on, and was toggled on?", tag);
-              state = TRUE;
-            }          
-          else if (gtk_text_iter_ends_tag (&iter, tag))
-            {
-              if (!state)
-                g_error ("Tag %p toggled off, but wasn't toggled on?", tag);
-              state = FALSE;
-            }
-          else
-            g_error ("forward_to_tag_toggle went to a location without a toggle");
-        }
-      while (gtk_text_iter_forward_to_tag_toggle (&iter, tag) &&
-             gtk_text_iter_compare (&iter, end) <= 0);
-    }
-
-  if (count != buffer_count)
-    g_error ("Counted %d tags iterating by char, %d iterating forward by tag toggle\n",
-             buffer_count, count);
-  
-  state = FALSE;
-  count = 0;
-  
-  iter = *end;
-  last_offset = gtk_text_iter_get_offset (&iter);
-  if (gtk_text_iter_toggles_tag (&iter, tag) ||
-      gtk_text_iter_backward_to_tag_toggle (&iter, tag))
-    {
-      do
-        {
-          gint this_offset;
-          
-          ++count;
-
-          this_offset = gtk_text_iter_get_offset (&iter);
-          
-          if (this_offset >= last_offset)
-            g_error ("backward_to_tag_toggle moved in wrong direction");
-          
-          last_offset = this_offset;
-
-          if (gtk_text_iter_begins_tag (&iter, tag))
-            {
-              if (!state)
-                g_error ("Tag %p wasn't on when we got to the on toggle going backward?", tag);
-              state = FALSE;
-            }
-          else if (gtk_text_iter_ends_tag (&iter, tag))
-            {
-              if (state)
-                g_error ("Tag %p off toggle, but we were already inside a tag?", tag);
-              state = TRUE;
-            }
-          else
-            g_error ("backward_to_tag_toggle went to a location without a toggle");
-        }
-      while (gtk_text_iter_backward_to_tag_toggle (&iter, tag) &&
-             gtk_text_iter_compare (&iter, start) >= 0);
-    }
-
-  if (count != buffer_count)
-    g_error ("Counted %d tags iterating by char, %d iterating backward by tag toggle\n",
-             buffer_count, count);
-}
-
-static void
-check_specific_tag (GtkTextBuffer *buffer,
-                    const gchar   *tag_name)
-{
-  GtkTextIter start, end;
-
-  gtk_text_buffer_get_bounds (buffer, &start, &end);
-  check_specific_tag_in_range (buffer, tag_name, &start, &end);
-  gtk_text_iter_forward_chars (&start, 2);
-  gtk_text_iter_backward_chars (&end, 2);
-  if (gtk_text_iter_compare (&start, &end) < 0)
-    check_specific_tag_in_range (buffer, tag_name, &start, &end);
-}
-
-static void
-run_tests (GtkTextBuffer *buffer)
-{
-  GtkTextIter iter;
-  GtkTextIter start;
-  GtkTextIter end;
-  GtkTextIter mark;
-  gint i, j;
-  gint num_chars;
-  GtkTextMark *bar_mark;
-  GtkTextTag *tag;
-  GHashTable *tag_states;
-  gint count;
-  gint buffer_count;
-  
-  gtk_text_buffer_get_bounds (buffer, &start, &end);
-
-  /* Check that walking the tree via chars and via iterators produces
-   * the same number of indexable locations.
-   */
-  num_chars = gtk_text_buffer_get_char_count (buffer);
-  iter = start;
-  bar_mark = gtk_text_buffer_create_mark (buffer, "bar", &iter, FALSE);
-  i = 0;
-  while (i < num_chars)
-    {
-      GtkTextIter current;
-      GtkTextMark *foo_mark;
-
-      gtk_text_buffer_get_iter_at_offset (buffer, &current, i);
-
-      if (!gtk_text_iter_equal (&iter, &current))
-        {
-          g_error ("get_char_index didn't return current iter");
-        }
-
-      j = gtk_text_iter_get_offset (&iter);
-
-      if (i != j)
-        {
-          g_error ("iter converted to %d not %d", j, i);
-        }
-
-      /* get/set mark */
-      gtk_text_buffer_get_iter_at_mark (buffer, &mark, bar_mark);
-
-      if (!gtk_text_iter_equal (&iter, &mark))
-        {
-          gtk_text_iter_spew (&iter, "iter");
-          gtk_text_iter_spew (&mark, "mark");
-          g_error ("Mark not moved to the right place.");
-        }
-
-      foo_mark = gtk_text_buffer_create_mark (buffer, "foo", &iter, FALSE);
-      gtk_text_buffer_get_iter_at_mark (buffer, &mark, foo_mark);
-      gtk_text_buffer_delete_mark (buffer, foo_mark);
-
-      if (!gtk_text_iter_equal (&iter, &mark))
-        {
-          gtk_text_iter_spew (&iter, "iter");
-          gtk_text_iter_spew (&mark, "mark");
-          g_error ("Mark not created in the right place.");
-        }
-
-      if (gtk_text_iter_is_end (&iter))
-        g_error ("iterators ran out before chars (offset %d of %d)",
-                 i, num_chars);
-
-      gtk_text_iter_forward_char (&iter);
-
-      gtk_text_buffer_move_mark (buffer, bar_mark, &iter);
-
-      ++i;
-    }
-
-  if (!gtk_text_iter_equal (&iter, &end))
-    g_error ("Iterating over all chars didn't end with the end iter");
-
-  /* Do the tree-walk backward
-   */
-  num_chars = gtk_text_buffer_get_char_count (buffer);
-  gtk_text_buffer_get_iter_at_offset (buffer, &iter, -1);
-
-  gtk_text_buffer_move_mark (buffer, bar_mark, &iter);
-
-  i = num_chars;
-
-  if (!gtk_text_iter_equal (&iter, &end))
-    g_error ("iter at char -1 is not equal to the end iterator");
-
-  while (i >= 0)
-    {
-      GtkTextIter current;
-      GtkTextMark *foo_mark;
-
-      gtk_text_buffer_get_iter_at_offset (buffer, &current, i);
-
-      if (!gtk_text_iter_equal (&iter, &current))
-        {
-          g_error ("get_char_index didn't return current iter while going backward");
-        }
-      j = gtk_text_iter_get_offset (&iter);
-
-      if (i != j)
-        {
-          g_error ("going backward, iter converted to %d not %d", j, i);
-        }
-
-      /* get/set mark */
-      gtk_text_buffer_get_iter_at_mark (buffer, &mark, bar_mark);
-
-      if (!gtk_text_iter_equal (&iter, &mark))
-        {
-          gtk_text_iter_spew (&iter, "iter");
-          gtk_text_iter_spew (&mark, "mark");
-          g_error ("Mark not moved to the right place.");
-        }
-
-      foo_mark = gtk_text_buffer_create_mark (buffer, "foo", &iter, FALSE);
-      gtk_text_buffer_get_iter_at_mark (buffer, &mark, foo_mark);
-      gtk_text_buffer_delete_mark (buffer, foo_mark);
-
-      if (!gtk_text_iter_equal (&iter, &mark))
-        {
-          gtk_text_iter_spew (&iter, "iter");
-          gtk_text_iter_spew (&mark, "mark");
-          g_error ("Mark not created in the right place.");
-        }
-
-      if (i > 0)
-        {
-          if (!gtk_text_iter_backward_char (&iter))
-            g_error ("iterators ran out before char indexes");
-
-          gtk_text_buffer_move_mark (buffer, bar_mark, &iter);
-        }
-      else
-        {
-          if (gtk_text_iter_backward_char (&iter))
-            g_error ("went backward from 0?");
-        }
-
-      --i;
-    }
-
-  if (!gtk_text_iter_equal (&iter, &start))
-    g_error ("Iterating backward over all chars didn't end with the start iter");
-
-  /*
-   * Check that get_line_count returns the same number of lines
-   * as walking the tree by line
-   */
-  i = 1; /* include current (first) line */
-  gtk_text_buffer_get_iter_at_line (buffer, &iter, 0);
-  while (gtk_text_iter_forward_line (&iter))
-    ++i;
-
-  if (i != gtk_text_buffer_get_line_count (buffer))
-    g_error ("Counted %d lines, buffer has %d", i,
-             gtk_text_buffer_get_line_count (buffer));
-
-  /*
-   * Check that moving over tag toggles thinks about working.
-   */
-
-  buffer_count = count_toggles_in_buffer (buffer, NULL);
-  
-  tag_states = g_hash_table_new (NULL, NULL);
-  count = 0;
-  
-  gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
-  if (gtk_text_iter_toggles_tag (&iter, NULL) ||
-      gtk_text_iter_forward_to_tag_toggle (&iter, NULL))
-    {
-      do
-        {
-          GSList *tags;
-          GSList *tmp;
-          gboolean found_some = FALSE;
-          
-          /* get toggled-on tags */
-          tags = gtk_text_iter_get_toggled_tags (&iter, TRUE);
-
-          if (tags)
-            found_some = TRUE;
-          
-          tmp = tags;
-          while (tmp != NULL)
-            {
-              ++count;
-              
-              tag = tmp->data;
-              
-              if (g_hash_table_lookup (tag_states, tag))
-                g_error ("Tag %p is already on, and was toggled on?", tag);
-
-              g_hash_table_insert (tag_states, tag, GINT_TO_POINTER (TRUE));
-          
-              tmp = g_slist_next (tmp);
-            }
-
-          g_slist_free (tags);
-      
-          /* get toggled-off tags */
-          tags = gtk_text_iter_get_toggled_tags (&iter, FALSE);
-
-          if (tags)
-            found_some = TRUE;
-          
-          tmp = tags;
-          while (tmp != NULL)
-            {
-              ++count;
-              
-              tag = tmp->data;
-
-              if (!g_hash_table_lookup (tag_states, tag))
-                g_error ("Tag %p is already off, and was toggled off?", tag);
-
-              g_hash_table_remove (tag_states, tag);
-          
-              tmp = g_slist_next (tmp);
-            }
-
-          g_slist_free (tags);
-
-          if (!found_some)
-            g_error ("No tags found going forward to tag toggle.");
-
-        }
-      while (gtk_text_iter_forward_to_tag_toggle (&iter, NULL));
-    }
-  
-  g_hash_table_destroy (tag_states);
-
-  if (count != buffer_count)
-    g_error ("Counted %d tags iterating by char, %d iterating by tag toggle\n",
-             buffer_count, count);
-  
-  /* Go backward; here TRUE in the hash means we saw
-   * an off toggle last.
-   */
-  
-  tag_states = g_hash_table_new (NULL, NULL);
-  count = 0;
-  
-  gtk_text_buffer_get_end_iter (buffer, &iter);
-  if (gtk_text_iter_toggles_tag (&iter, NULL) ||
-      gtk_text_iter_backward_to_tag_toggle (&iter, NULL))
-    {
-      do
-        {
-          GSList *tags;
-          GSList *tmp;
-          gboolean found_some = FALSE;
-          
-          /* get toggled-off tags */
-          tags = gtk_text_iter_get_toggled_tags (&iter, FALSE);
-
-          if (tags)
-            found_some = TRUE;
-          
-          tmp = tags;
-          while (tmp != NULL)
-            {
-              ++count;
-              
-              tag = tmp->data;
-
-              if (g_hash_table_lookup (tag_states, tag))
-                g_error ("Tag %p has two off-toggles in a row?", tag);
-          
-              g_hash_table_insert (tag_states, tag, GINT_TO_POINTER (TRUE));
-          
-              tmp = g_slist_next (tmp);
-            }
-
-          g_slist_free (tags);
-      
-          /* get toggled-on tags */
-          tags = gtk_text_iter_get_toggled_tags (&iter, TRUE);
-
-          if (tags)
-            found_some = TRUE;
-          
-          tmp = tags;
-          while (tmp != NULL)
-            {
-              ++count;
-              
-              tag = tmp->data;
-
-              if (!g_hash_table_lookup (tag_states, tag))
-                g_error ("Tag %p was toggled on, but saw no off-toggle?", tag);
-
-              g_hash_table_remove (tag_states, tag);
-          
-              tmp = g_slist_next (tmp);
-            }
-
-          g_slist_free (tags);
-
-          if (!found_some)
-            g_error ("No tags found going backward to tag toggle.");
-        }
-      while (gtk_text_iter_backward_to_tag_toggle (&iter, NULL));
-    }
-  
-  g_hash_table_destroy (tag_states);
-
-  if (count != buffer_count)
-    g_error ("Counted %d tags iterating by char, %d iterating by tag toggle\n",
-             buffer_count, count);
-
-  check_specific_tag (buffer, "fg_red");
-  check_specific_tag (buffer, "bg_green");
-  check_specific_tag (buffer, "front_tag");
-  check_specific_tag (buffer, "center_tag");
-  check_specific_tag (buffer, "end_tag");
-}
-
-
-static const char  *book_closed_xpm[] = {
-"16 16 6 1",
-"       c None s None",
-".      c black",
-"X      c red",
-"o      c yellow",
-"O      c #808080",
-"#      c white",
-"                ",
-"       ..       ",
-"     ..XX.      ",
-"   ..XXXXX.     ",
-" ..XXXXXXXX.    ",
-".ooXXXXXXXXX.   ",
-"..ooXXXXXXXXX.  ",
-".X.ooXXXXXXXXX. ",
-".XX.ooXXXXXX..  ",
-" .XX.ooXXX..#O  ",
-"  .XX.oo..##OO. ",
-"   .XX..##OO..  ",
-"    .X.#OO..    ",
-"     ..O..      ",
-"      ..        ",
-"                "};
-
-static void
-fill_buffer (GtkTextBuffer *buffer)
-{
-  GtkTextTag *tag;
-  GdkColor color, color2;
-  GtkTextIter iter;
-  GtkTextIter iter2;
-  GdkPixbuf *pixbuf;
-  int i;
-
-  color.red = color.green = 0;
-  color.blue = 0xffff;
-  color2.red = 0xfff;
-  color2.blue = 0x0;
-  color2.green = 0;
-  
-  gtk_text_buffer_create_tag (buffer, "fg_blue",
-                              "foreground_gdk", &color,
-                              "background_gdk", &color2,
-                              "font", "-*-courier-bold-r-*-*-30-*-*-*-*-*-*-*",
-                              NULL);
-
-  color.blue = color.green = 0;
-  color.red = 0xffff;
-  
-  gtk_text_buffer_create_tag (buffer, "fg_red",
-                              "rise", -4,
-                              "foreground_gdk", &color,
-                              NULL);
-
-  color.blue = color.red = 0;
-  color.green = 0xffff;
-  
-  gtk_text_buffer_create_tag (buffer, "bg_green",
-                              "background_gdk", &color,
-                              "font", "-*-courier-bold-r-*-*-10-*-*-*-*-*-*-*",
-                              NULL);
-
-  pixbuf = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
-
-  g_assert (pixbuf != NULL);
-
-  i = 0;
-  while (i < 10)
-    {
-      gchar *str;
-
-      gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
-
-      gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
-
-      gtk_text_buffer_get_iter_at_offset (buffer, &iter, 1);
-
-      gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
-
-      str = g_strdup_printf ("%d Hello World!\nwoo woo woo woo woo woo woo woo\n",
-                            i);
-
-      gtk_text_buffer_insert (buffer, &iter, str, -1);
-
-      g_free (str);
-
-      gtk_text_buffer_insert (buffer, &iter,
-                              "(Hello World!)\nfoo foo Hello this is some text we are using to text word wrap. It has punctuation! gee; blah - hmm, great.\nnew line\n\n"
-                              /* This is UTF8 stuff, Emacs doesn't
-                                 really know how to display it */
-                              "Spanish (Espa\303\261ol) \302\241Hola! / French (Fran\303\247ais) Bonjour, Salut / German (Deutsch S\303\274d) Gr\303\274\303\237 Gott (testing Latin-1 chars encoded in UTF8)\nThai (we can't display this, just making sure we don't crash)  (\340\270\240\340\270\262\340\270\251\340\270\262\340\271\204\340\270\227\340\270\242)  \340\270\252\340\270\247\340\270\261\340\270\252\340\270\224\340\270\265\340\270\204\340\270\243\340\270\261\340\270\232, \340\270\252\340\270\247\340\270\261\340\270\252\340\270\224\340\270\265\340\270\204\340\271\210\340\270\260\n",
-                              -1);
-
-      gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
-      gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
-
-      gtk_text_buffer_get_iter_at_offset (buffer, &iter, 4);
-
-      gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
-
-      gtk_text_buffer_get_iter_at_offset (buffer, &iter, 7);
-
-      gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
-
-      gtk_text_buffer_get_iter_at_offset (buffer, &iter, 8);
-
-      gtk_text_buffer_insert_pixbuf (buffer, &iter, pixbuf);
-
-      gtk_text_buffer_get_iter_at_line_offset (buffer, &iter, 0, 8);
-      iter2 = iter;
-      gtk_text_iter_forward_chars (&iter2, 10);
-
-      gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
-
-      gtk_text_iter_forward_chars (&iter, 7);
-      gtk_text_iter_forward_chars (&iter2, 10);
-
-      gtk_text_buffer_apply_tag_by_name (buffer, "bg_green", &iter, &iter2);
-
-      gtk_text_iter_forward_chars (&iter, 12);
-      gtk_text_iter_forward_chars (&iter2, 10);
-
-      gtk_text_buffer_apply_tag_by_name (buffer, "bg_green", &iter, &iter2);
-
-      gtk_text_iter_forward_chars (&iter, 10);
-      gtk_text_iter_forward_chars (&iter2, 15);
-
-      gtk_text_buffer_apply_tag_by_name (buffer, "fg_red", &iter, &iter2);
-      gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
-
-      gtk_text_iter_forward_chars (&iter, 20);
-      gtk_text_iter_forward_chars (&iter2, 20);
-
-      gtk_text_buffer_apply_tag_by_name (buffer, "fg_red", &iter, &iter2);
-      gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
-
-      gtk_text_iter_backward_chars (&iter, 25);
-      gtk_text_iter_forward_chars (&iter2, 5);
-
-      gtk_text_buffer_apply_tag_by_name (buffer, "fg_red", &iter, &iter2);
-      gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &iter, &iter2);
-
-      gtk_text_iter_forward_chars (&iter, 15);
-      gtk_text_iter_backward_chars (&iter2, 10);
-
-      gtk_text_buffer_remove_tag_by_name (buffer, "fg_red", &iter, &iter2);
-      gtk_text_buffer_remove_tag_by_name (buffer, "fg_blue", &iter, &iter2);
-
-      ++i;
-    }
-
-  /* Put in tags that are just at the beginning, and just near the end,
-   * and just near the middle.
-   */
-  tag = gtk_text_buffer_create_tag (buffer, "front_tag", NULL);
-  gtk_text_buffer_get_iter_at_offset (buffer, &iter, 3);
-  gtk_text_buffer_get_iter_at_offset (buffer, &iter2, 300);
-
-  gtk_text_buffer_apply_tag (buffer, tag, &iter, &iter2);  
-  
-  tag = gtk_text_buffer_create_tag (buffer, "end_tag", NULL);
-  gtk_text_buffer_get_end_iter (buffer, &iter2);
-  gtk_text_iter_backward_chars (&iter2, 12);
-  iter = iter2;
-  gtk_text_iter_backward_chars (&iter, 157);
-
-  gtk_text_buffer_apply_tag (buffer, tag, &iter, &iter2);
-  
-  tag = gtk_text_buffer_create_tag (buffer, "center_tag", NULL);
-  gtk_text_buffer_get_iter_at_offset (buffer, &iter,
-                                      gtk_text_buffer_get_char_count (buffer)/2);
-  gtk_text_iter_backward_chars (&iter, 37);
-  iter2 = iter;
-  gtk_text_iter_forward_chars (&iter2, 57);
-
-  gtk_text_buffer_apply_tag (buffer, tag, &iter, &iter2);  
-
-  g_object_unref (pixbuf);
-}
-
-
-/*
- * Line separator tests (initially to avoid regression on bugzilla #57428)
- */
-
-static void
-test_line_separation (const char* str,
-                      gboolean    expect_next_line,
-                      gboolean    expect_end_iter,
-                      int         expected_line_count,
-                      int         expected_line_break,
-                      int         expected_next_line_start)
-{
-  GtkTextIter iter;
-  GtkTextBuffer* buffer;
-  gboolean on_next_line;
-  gboolean on_end_iter;
-  gint new_pos;
-
-  buffer = gtk_text_buffer_new (NULL);
-
-  gtk_text_buffer_set_text (buffer, str, -1);
-  gtk_text_buffer_get_iter_at_offset (buffer, &iter, expected_line_break);
-
-  g_assert (gtk_text_iter_ends_line (&iter) || gtk_text_iter_is_end (&iter));
-
-  g_assert (gtk_text_buffer_get_line_count (buffer) == expected_line_count);
-  
-  on_next_line = gtk_text_iter_forward_line (&iter);
-
-  g_assert (expect_next_line == on_next_line);
-
-  on_end_iter = gtk_text_iter_is_end (&iter);
-
-  g_assert (on_end_iter == expect_end_iter);
-  
-  new_pos = gtk_text_iter_get_offset (&iter);
-    
-  if (on_next_line)
-    g_assert (expected_next_line_start == new_pos);
-
-  ++expected_line_break;
-  while (expected_line_break < expected_next_line_start)
-    {
-      gtk_text_buffer_get_iter_at_offset (buffer, &iter, expected_line_break);
-
-      g_assert (!gtk_text_iter_ends_line (&iter));
-
-      on_next_line = gtk_text_iter_forward_line (&iter);
-        
-      g_assert (expect_next_line == on_next_line);
-        
-      new_pos = gtk_text_iter_get_offset (&iter);
-        
-      if (on_next_line)
-        g_assert (expected_next_line_start == new_pos);
-        
-      ++expected_line_break;
-    }
-
-  /* FIXME tests for backward line */
-  
-  g_object_unref (buffer);
-}
-
-/* there are cases where \r and \n should not be treated like \r\n,
- * originally bug #337022. */
-static void
-split_r_n_separators_test (void)
-{
-  GtkTextBuffer *buffer;
-  GtkTextIter iter;
-
-  buffer = gtk_text_buffer_new (NULL);
-
-  gtk_text_buffer_set_text (buffer, "foo\ra\nbar\n", -1);
-
-  /* delete 'a' so that we have
-
-     1 foo\r
-     2 \n
-     3 bar\n
-
-   * and both \r and \n are line separators */
-
-  gtk_text_buffer_get_iter_at_offset (buffer, &iter, 5);
-  gtk_text_buffer_backspace (buffer, &iter, TRUE, TRUE);
-
-  g_assert (gtk_text_iter_ends_line (&iter));
-
-  gtk_text_buffer_get_iter_at_offset (buffer, &iter, 3);
-  g_assert (gtk_text_iter_ends_line (&iter));
-}
-
-static void
-test_line_separator (void)
-{
-  char *str;
-  char buf[7] = { '\0', };
-
-  /* Only one character has type G_UNICODE_PARAGRAPH_SEPARATOR in
-   * Unicode 3.0; update this if that changes.
-   */
-#define PARAGRAPH_SEPARATOR 0x2029
-  
-  test_line_separation ("line", FALSE, TRUE, 1, 4, 4);
-  test_line_separation ("line\r\n", FALSE, TRUE, 2, 4, 6);
-  test_line_separation ("line\r", FALSE, TRUE, 2, 4, 5);
-  test_line_separation ("line\n", FALSE, TRUE, 2, 4, 5);
-  test_line_separation ("line\rqw", TRUE, FALSE, 2, 4, 5);
-  test_line_separation ("line\nqw", TRUE, FALSE, 2, 4, 5);
-  test_line_separation ("line\r\nqw", TRUE, FALSE, 2, 4, 6);
-  
-  g_unichar_to_utf8 (PARAGRAPH_SEPARATOR, buf);
-  
-  str = g_strdup_printf ("line%s", buf);
-  test_line_separation (str, FALSE, TRUE, 2, 4, 5);
-  g_free (str);
-  str = g_strdup_printf ("line%sqw", buf);
-  test_line_separation (str, TRUE, FALSE, 2, 4, 5);
-  g_free (str);
-
-  split_r_n_separators_test ();
-}
-
-static void
-test_logical_motion (void)
-{
-  char *str;
-  char buf1[7] = { '\0', };
-  char buf2[7] = { '\0', };
-  char buf3[7] = { '\0', };
-  int expected[30];
-  int expected_steps;
-  int i;
-  GtkTextBuffer *buffer;
-  GtkTextIter iter;
-  
-  buffer = gtk_text_buffer_new (NULL);
-  
-#define LEADING_JAMO 0x1111
-#define VOWEL_JAMO 0x1167
-#define TRAILING_JAMO 0x11B9
-  
-  g_unichar_to_utf8 (LEADING_JAMO, buf1);
-  g_unichar_to_utf8 (VOWEL_JAMO, buf2);
-  g_unichar_to_utf8 (TRAILING_JAMO, buf3);
-
-  /* Build the string "abc<leading><vowel><trailing>def\r\nxyz" */
-  str = g_strconcat ("abc", buf1, buf2, buf3, "def\r\nxyz", NULL);
-  gtk_text_buffer_set_text (buffer, str, -1);
-  g_free (str);
-  
-  /* Check cursor positions */
-  memset (expected, 0, sizeof (expected));
-  expected[0] = 0;    /* before 'a' */
-  expected[1] = 1;    /* before 'b' */
-  expected[2] = 2;    /* before 'c' */
-  expected[3] = 3;    /* before jamo */
-  expected[4] = 6;    /* before 'd' */
-  expected[5] = 7;    /* before 'e' */
-  expected[6] = 8;    /* before 'f' */
-  expected[7] = 9;    /* before '\r' */
-  expected[8] = 11;   /* before 'x' */
-  expected[9] = 12;   /* before 'y' */
-  expected[10] = 13;  /* before 'z' */
-  expected[11] = 14;  /* after 'z' (only matters going backward) */
-  expected_steps = 11;
-  
-  gtk_text_buffer_get_start_iter (buffer, &iter);
-  i = 0;
-  do
-    {
-      int pos;
-
-      pos = gtk_text_iter_get_offset (&iter);
-      
-      if (pos != expected[i])
-        {
-          g_error ("Cursor position %d, expected %d",
-                   pos, expected[i]);
-        }
-
-      ++i;      
-    }
-  while (gtk_text_iter_forward_cursor_position (&iter));
-
-  if (!gtk_text_iter_is_end (&iter))
-    g_error ("Expected to stop at the end iterator\n");
-
-  if (!gtk_text_iter_is_cursor_position (&iter))
-    g_error ("Should be a cursor position before the end iterator");
-  
-  if (i != expected_steps)
-    g_error ("Expected %d steps, there were actually %d\n", expected_steps, i);
-
-  i = expected_steps;
-  do
-    {
-      int pos;
-
-      pos = gtk_text_iter_get_offset (&iter);
-      
-      if (pos != expected[i])
-        {
-          g_error ("Moving backward, cursor position %d, expected %d",
-                   pos, expected[i]);
-        }
-
-      /* g_print ("%d = %d\n", pos, expected[i]); */
-      
-      --i;
-    }
-  while (gtk_text_iter_backward_cursor_position (&iter));
-
-  if (i != -1)
-    g_error ("Expected %d steps, there were actually %d\n", expected_steps - i, i);
-
-  if (!gtk_text_iter_is_start (&iter))
-    g_error ("Expected to stop at the start iterator\n");
-
-
-  /* Check sentence boundaries */
-  
-  gtk_text_buffer_set_text (buffer, "Hi.\nHi. \nHi! Hi. Hi? Hi.", -1);
-
-  memset (expected, 0, sizeof (expected));
-
-  expected[0] = 0;    /* before first Hi */
-  expected[1] = 3;    /* After first . */
-  expected[2] = 7;    /* After second . */
-  expected[3] = 12;   /* After ! */
-  expected[4] = 16;   /* After third . */
-  expected[5] = 20;   /* After ? */
-  
-  expected_steps = 6;
-  
-  gtk_text_buffer_get_start_iter (buffer, &iter);
-  i = 0;
-  do
-    {
-      int pos;
-
-      pos = gtk_text_iter_get_offset (&iter);
-
-      if (pos != expected[i])
-        {
-          g_error ("Sentence position %d, expected %d",
-                   pos, expected[i]);
-        }
-
-      if (i != 0 &&
-          !gtk_text_iter_is_end (&iter) &&
-          !gtk_text_iter_ends_sentence (&iter))
-        g_error ("Iterator at %d should end a sentence", pos);
-      
-      ++i;
-    }
-  while (gtk_text_iter_forward_sentence_end (&iter));
-
-  if (i != expected_steps)
-    g_error ("Expected %d steps, there were actually %d\n", expected_steps, i);
-
-  if (!gtk_text_iter_is_end (&iter))
-    g_error ("Expected to stop at the end iterator\n");
-  
-  gtk_text_buffer_set_text (buffer, "Hi.\nHi. \nHi! Hi. Hi? Hi.", -1);
-
-  memset (expected, 0, sizeof (expected));
-
-  expected[0] = 24;
-  expected[1] = 21;
-  expected[2] = 17;
-  expected[3] = 13;
-  expected[4] = 9;
-  expected[5] = 4;
-  expected[6] = 0;
-  
-  expected_steps = 7;
-  
-  gtk_text_buffer_get_end_iter (buffer, &iter);
-  i = 0;
-  do
-    {
-      int pos;
-
-      pos = gtk_text_iter_get_offset (&iter);
-
-      if (pos != expected[i])
-        {
-          g_error ("Sentence position %d, expected %d",
-                   pos, expected[i]);
-        }
-
-      if (pos != 0 &&
-          !gtk_text_iter_is_end (&iter) &&
-          !gtk_text_iter_starts_sentence (&iter))
-        g_error ("Iterator at %d should start a sentence", pos);
-      
-      ++i;
-    }
-  while (gtk_text_iter_backward_sentence_start (&iter));
-
-  if (i != expected_steps)
-    g_error ("Expected %d steps, there were actually %d\n", expected_steps, i);
-
-  if (gtk_text_iter_get_offset (&iter) != 0)
-    g_error ("Expected to stop at the start iterator\n");
-  
-  g_object_unref (buffer);
-}
-
-static void
-test_marks (void)
-{
-  GtkTextBuffer *buf1, *buf2;
-  GtkTextMark *mark;
-  GtkTextIter iter;
-
-  buf1 = gtk_text_buffer_new (NULL);
-  buf2 = gtk_text_buffer_new (NULL);
-
-  gtk_text_buffer_get_start_iter (buf1, &iter);
-  mark = gtk_text_buffer_create_mark (buf1, "foo", &iter, TRUE);
-  g_object_ref (mark);
-  gtk_text_mark_set_visible (mark, TRUE);
-  gtk_text_buffer_delete_mark (buf1, mark);
-
-  g_assert (gtk_text_mark_get_visible (mark));
-  g_assert (gtk_text_mark_get_left_gravity (mark));
-  g_assert (!strcmp ("foo", gtk_text_mark_get_name (mark)));
-  g_assert (gtk_text_mark_get_buffer (mark) == NULL);
-  g_assert (gtk_text_mark_get_deleted (mark));
-  g_assert (gtk_text_buffer_get_mark (buf1, "foo") == NULL);
-
-  gtk_text_buffer_get_start_iter (buf2, &iter);
-  gtk_text_buffer_add_mark (buf2, mark, &iter);
-  gtk_text_buffer_insert (buf2, &iter, "ewfwefwefwe", -1);
-  gtk_text_buffer_get_iter_at_mark (buf2, &iter, mark);
-
-  g_assert (gtk_text_mark_get_visible (mark));
-  g_assert (gtk_text_iter_is_start (&iter));
-  g_assert (gtk_text_mark_get_left_gravity (mark));
-  g_assert (!strcmp ("foo", gtk_text_mark_get_name (mark)));
-  g_assert (gtk_text_mark_get_buffer (mark) == buf2);
-  g_assert (!gtk_text_mark_get_deleted (mark));
-  g_assert (gtk_text_buffer_get_mark (buf2, "foo") == mark);
-
-  gtk_text_buffer_delete_mark (buf2, mark);
-  gtk_text_mark_set_visible (mark, FALSE);
-  g_object_unref (mark);
-
-  mark = gtk_text_mark_new ("blah", TRUE);
-  gtk_text_buffer_get_start_iter (buf1, &iter);
-  gtk_text_mark_set_visible (mark, TRUE);
-  gtk_text_buffer_add_mark (buf1, mark, &iter);
-
-  g_assert (gtk_text_mark_get_visible (mark));
-  g_assert (gtk_text_mark_get_buffer (mark) == buf1);
-  g_assert (!gtk_text_mark_get_deleted (mark));
-  g_assert (gtk_text_buffer_get_mark (buf1, "blah") == mark);
-  g_assert (!strcmp ("blah", gtk_text_mark_get_name (mark)));
-
-  gtk_text_mark_set_visible (mark, FALSE);
-  gtk_text_buffer_delete_mark (buf1, mark);
-  g_assert (!gtk_text_mark_get_visible (mark));
-  g_assert (gtk_text_buffer_get_mark (buf1, "blah") == NULL);
-  g_assert (gtk_text_mark_get_buffer (mark) == NULL);
-  g_assert (gtk_text_mark_get_deleted (mark));
-
-  gtk_text_buffer_get_start_iter (buf2, &iter);
-  gtk_text_buffer_add_mark (buf2, mark, &iter);
-  g_assert (gtk_text_mark_get_buffer (mark) == buf2);
-  g_assert (!gtk_text_mark_get_deleted (mark));
-  g_assert (gtk_text_buffer_get_mark (buf2, "blah") == mark);
-  g_assert (!strcmp ("blah", gtk_text_mark_get_name (mark)));
-
-  g_object_unref (mark);
-  g_object_unref (buf1);
-  g_object_unref (buf2);
-}
-
-static void
-test_utf8 (void)
-{
-  gunichar ch;
-
-  /* Check UTF8 unknown char thing */
-  g_assert (g_utf8_strlen (gtk_text_unknown_char_utf8, 3) == 1);
-  ch = g_utf8_get_char (gtk_text_unknown_char_utf8);
-  g_assert (ch == GTK_TEXT_UNKNOWN_CHAR);
-}
-
-static void
-test_empty_buffer (void)
-{
-  GtkTextBuffer *buffer;
-  int n;
-  GtkTextIter start;
-
-  buffer = gtk_text_buffer_new (NULL);
-
-  /* Check that buffer starts with one empty line and zero chars */
-  n = gtk_text_buffer_get_line_count (buffer);
-  if (n != 1)
-    g_error ("%d lines, expected 1", n);
-
-  n = gtk_text_buffer_get_char_count (buffer);
-  if (n != 0)
-    g_error ("%d chars, expected 0", n);
-
-  /* empty first line contains 0 chars */
-  gtk_text_buffer_get_start_iter (buffer, &start);
-  n = gtk_text_iter_get_chars_in_line (&start);
-  if (n != 0)
-    g_error ("%d chars in first line, expected 0", n);
-  n = gtk_text_iter_get_bytes_in_line (&start);
-  if (n != 0)
-    g_error ("%d bytes in first line, expected 0", n);
-  
-  /* Run gruesome alien test suite on buffer */
-  run_tests (buffer);
-
-  g_object_unref (buffer);
-}
-
-static void
-test_get_set(void)
-{
-  GtkTextBuffer *buffer;
-
-  buffer = gtk_text_buffer_new (NULL);
-
-  check_get_set_text (buffer, "Hello");
-  check_get_set_text (buffer, "Hello\n");
-  check_get_set_text (buffer, "Hello\r\n");
-  check_get_set_text (buffer, "Hello\r");
-  check_get_set_text (buffer, "Hello\nBar\nFoo");
-  check_get_set_text (buffer, "Hello\nBar\nFoo\n");
-
-  g_object_unref (buffer);
-}
-
-static void
-test_fill_empty (void)
-{
-  GtkTextBuffer *buffer;
-  int n;
-  GtkTextIter start, end;
-  
-  buffer = gtk_text_buffer_new (NULL);
-
-  /* Put stuff in the buffer */
-  fill_buffer (buffer);
-
-  /* Subject stuff-bloated buffer to further torment */
-  run_tests (buffer);
-
-  /* Delete all stuff from the buffer */
-  gtk_text_buffer_get_bounds (buffer, &start, &end);
-  gtk_text_buffer_delete (buffer, &start, &end);
-
-  /* Check buffer for emptiness (note that a single
-     empty line always remains in the buffer) */
-  n = gtk_text_buffer_get_line_count (buffer);
-  if (n != 1)
-    g_error ("%d lines, expected 1", n);
-
-  n = gtk_text_buffer_get_char_count (buffer);
-  if (n != 0)
-    g_error ("%d chars, expected 0", n);
-
-  run_tests (buffer);
-
-  g_object_unref (buffer);
-}
-
-static void
-test_tag (void)
-{
-  GtkTextBuffer *buffer;
-  GtkTextIter start, end;
-  
-  buffer = gtk_text_buffer_new (NULL);
-
-  fill_buffer (buffer);
-
-  gtk_text_buffer_set_text (buffer, "adcdef", -1);
-  gtk_text_buffer_get_iter_at_offset (buffer, &start, 1);
-  gtk_text_buffer_get_iter_at_offset (buffer, &end, 3);
-  gtk_text_buffer_apply_tag_by_name (buffer, "fg_blue", &start, &end);
-  
-  run_tests (buffer);
-  
-  g_object_unref (buffer);
-}
-
-extern void pixbuf_init (void);
-
-int
-main (int argc, char** argv)
-{
-  /* First, we turn on btree debugging. */
-  gtk_debug_flags |= GTK_DEBUG_TEXT;
-
-  gtk_test_init (&argc, &argv);
-  pixbuf_init ();
-
-  g_test_add_func ("/TextBuffer/UTF8 unknown char", test_utf8);
-  g_test_add_func ("/TextBuffer/Line separator", test_line_separator);
-  g_test_add_func ("/TextBuffer/Logical motion", test_logical_motion);
-  g_test_add_func ("/TextBuffer/Marks", test_marks);
-  g_test_add_func ("/TextBuffer/Empty buffer", test_empty_buffer);
-  g_test_add_func ("/TextBuffer/Get and Set", test_get_set);
-  g_test_add_func ("/TextBuffer/Fill and Empty", test_fill_empty);
-  g_test_add_func ("/TextBuffer/Tag", test_tag);
-  
-  return g_test_run();
-}